Je suis consultant DBA (oui je sais, le terme est galvaudé), et bien souvent je me retrouve face au souci suivant: impossible d’être admin de mon poste et donc de m’installer un WAMP histoire de poser mes outils développés en PHP.
Je me note ici la recette pour avoir un apache php et un client oracle interconnectés. Je n’ai pas besoin de MySQL et je préfère travailler avec toute la puissance de mon ordinateur, je pars donc sur une solution full 64 bits.
Nous allons donc créer pas à pas un serveur P2OWA (Portable PHP Oracle Windows Apache).
Pré-Requis
Tous les distribuables portables reposent soit sur java sur sur la couche redistribuable de visual C, mais toujours dans une version précise. Je veux quelque chose d’efficace donc j’évite JAVA, je vais donc travailler avec apache / PHP et OCI.
Je vais donc dans “Panneau de configuration” “Programmes” “Programmes et fonctionnalités” pour voir quelle version j’ai du redistribuable Visual C, ici c’est la version 14 (.28.29914) de 2019 (année la plus haute), 32 et 64 bits comme le montre l’image ci dessous.
On peut aussi obtenir ce résultat avec powershell
Get-WmiObject -Class Win32_Product -Filter "Name LIKE '%Visual C%'" IdentifyingNumber : {BD8C6100-7C7D-48DD-93BA-69F6828213FE} Name : Microsoft Visual C++ 2019 X86 Additional Runtime - 14.28.29914 Vendor : Microsoft Corporation Version : 14.28.29914 Caption : Microsoft Visual C++ 2019 X86 Additional Runtime - 14.28.29914 IdentifyingNumber : {5A23DBE2-A05C-4A9C-9C17-EA88BF5D7B43} Name : Microsoft Visual C++ 2019 X64 Additional Runtime - 14.28.29914 Vendor : Microsoft Corporation Version : 14.28.29914 Caption : Microsoft Visual C++ 2019 X64 Additional Runtime - 14.28.29914 IdentifyingNumber : {42365A3A-622A-4EED-A727-FE192A794AFD} Name : Microsoft Visual C++ 2019 X86 Minimum Runtime - 14.28.29914 Vendor : Microsoft Corporation Version : 14.28.29914 Caption : Microsoft Visual C++ 2019 X86 Minimum Runtime - 14.28.29914 IdentifyingNumber : {455DF12C-7D43-4EFF-AE2F-43C8AF2817A3} Name : Microsoft Visual C++ 2019 X64 Minimum Runtime - 14.28.29914 Vendor : Microsoft Corporation Version : 14.28.29914 Caption : Microsoft Visual C++ 2019 X64 Minimum Runtime - 14.28.29914
Se procurer apache, PHP et OCI
- Apache: sa version portable est apache lounge https://www.apachelounge.com/download/ j’ai pris la version Apache 2.4 binaries VS17 qui est la plus récente, en effet apache me dit
VS17 is backward compatible, That means, a VS16/15/14 module can be used inside the VS17 binary.
- PHP: il est livré sous forme de fichier ZIP portable https://windows.php.net/download j’ai pris l’avant dernière version dans son patch set final soit à aujourd’hui la 8.1.18 en mode thread safe 64bits dont le README indique la compatibilité VC17 (donc 14 que j’ai).
- OCI: lui aussi livré sous forme de fichiers ZIP portables, au détail près que vous aurez notés les marqueurs de pluriels, je vais en prendre deux. https://www.oracle.com/fr/database/technologies/instant-client/winx64-64-downloads.html je choisis la version 19.18 (dernière 19 à ce jour) pour sa compatibilité avec les encore trop répendues versions 11 en 64 bits évidemment, il doit y avoir cohérence entre apache, php et OCI et je prends les packages “basic lite” pour les driveers et “SQL Plus” qui reste le meilleurs des ouils pour travailler avec Oracle.
Il est aussi autile de se procurer l’utilitaire FART.exe pour la mnipulation de fichiers texte en mode batch.
Préparer son environnement
Il faut dézipper les 3 paquets, à priori ou vous voulez, me concernant j’ai de créer un répertoire “portApps” dans mon répertoire d’accueil, sous lequel j’ai une arborescence Oracle qui va recevoir le client et une arborescence web qui recevra apache et php dans deux sous répertoires dédiés.
On obtient à peu près l’arborescence, qui a été réduite et simplifiée, suivante
PS C:\Users\-----------\portApps> tree . Structure du dossier pour le volume Windows-SSD Le numéro de série du volume est 106D-EE81 C:\USERS\-----------\PORTAPPS ├───Oracle │ └───instantclient_19_18 │ └───vc14 └───web ├───httpd-2.4 │ ├───bin │ ├───cgi-bin │ ├───conf │ ├───error │ ├───htdocs │ ├───icons │ ├───include │ ├───lib │ ├───logs │ ├───manual │ └───modules ├───my-app └───php-8.1.18 ├───dev ├───ext ├───extras └───lib
Configuration
Il faut maintenant configurer et pour ce faire :
- Configurer apache pour fonctionner avec PHP
- Configurer les modules que l’on souhaite utiliser dans PHP
- Configurer l’environnement de travail pour que PHP trouve toutes les bibliothèques dont il a besoin.
Je choisi de travailler dans des sauvegardes de fichiers de configuration afin de les retraiter automatiqument par batch quand j’en aurai besoin, ce qui pourra me permettre à l’avenir, par exemple, de changer de moteur PHP sans avoir à tout réinstaller.
Configuration d’apache
Dans l’arborescence vue plus haut, je travaille donc sous web\httpd-2.4\conf dans le fichier httpd.conf.bak. En tête de fichier j’ajoute les lignes suivantes juste avant Define SRVROOT “c:/Apache24”:
define PHPINSTALLDIR "PHP_DIR" PHPIniDir "${PHPINSTALLDIR}
Suite au commentaire suivant
# # Note that from this point forward you must specifically allow # particular features to be enabled - so if something's not working as # you might expect, make sure that you have specifically enabled it # below. #
J’ajoute les lignes suivantes pour que PHP soit reconnu d’apaceh
AddHandler application/x-httpd-php .php AddType application/x-httpd-php .php .html0 .phtml LoadModule PHP_MODULE
Je change la valeur de DirectoryIndex de
# # DirectoryIndex: sets the file that Apache will serve if a directory # is requested. # <IfModule dir_module> DirectoryIndex index.html </IfModule>
à
# # DirectoryIndex: sets the file that Apache will serve if a directory # is requested. # <IfModule dir_module> DirectoryIndex index.php index.html </IfModule>
Configuration de PHP
Dans l’arborescence vue plus haut, je travaille donc sous web\php-8.1.18 dans le fichier php.ini.bak qui est une copie, au choix et son votre environnement de php.ini-production ou de php.ini-development.
Dans la section :
;;;;;;;;;;;;;;;;;;;;;; ; Dynamic Extensions ; ;;;;;;;;;;;;;;;;;;;;;;
Je choisis les librairies PH que je veux activer, ici j’ai activé notamment bz2, ldap, sqlite3 et oci8_19 en dé commentant les lignes correspondantes :
extension=bz2 ; The ldap extension must be before curl if OpenSSL 1.0.2 and OpenLDAP is used ; otherwise it results in segfault when unloading after using SASL. ; See https://github.com/php/php-src/issues/8620 for more info. extension=ldap extension=curl ;extension=ffi extension=ftp extension=fileinfo extension=gd extension=gettext extension=gmp extension=intl extension=imap extension=mbstring extension=exif ; Must be after mbstring as it depends on it extension=mysqli ;extension=oci8_12c ; Use with Oracle Database 12c Instant Client extension=oci8_19 ; Use with Oracle Database 19 Instant Client extension=odbc extension=openssl ;extension=pdo_firebird ;extension=pdo_mysql ;extension=pdo_oci ;extension=pdo_odbc ;extension=pdo_pgsql ;extension=pdo_sqlite extension=pgsql ;extension=shmop ; The MIBS data available in the PHP distribution must be installed. ; See https://www.php.net/manual/en/snmp.installation.php ;extension=snmp ;extension=soap extension=sockets ;extension=sodium extension=sqlite3 ;extension=tidy ;extension=xsl
Afin que les modules d’extensions soient trouvés je dé-commente la ligne extension_dir = “ext”
; Directory in which the loadable extensions (modules) reside. ; https://php.net/extension-dir ;extension_dir = "./" ; On windows: extension_dir = "ext"
Configuration de l’environnement
Je crée un fichier batch de lancement qui va positionner les variables qui vont bien et lancer le serveur http / PHP / Oracle. J’utilise le logiciel FART pour traiter les fichiers bak et en faire des fichiers autilisables par PHP et apache.
J’ai besoin d’avoir un PATH mis à jour avec le repertoire contenant les librairies oracle, et le chemin vars les librairies “vendeur” que PHP livre (à savoir son répertoire d’installation. Je me définis un espace de déploiement des scripts html que je crée, ici my-app.
@ECHO OFF TITLE Apache HTTP Server v2.4.3 CLS ECHO Setting environment variables... SET ORACLE_HOME=C:\Users\-----------\portApps\Oracle\instantclient_19_18 SET DLL_NAME=php8apache2_4 SET MODULE_NAME=php_module SET VERSION_NUMBER=8.1.18 SET PATH=%ORACLE_HOME%;%PATH% SET APPPATH=%CD:Binaries=Programs% SET APACHE_DIR=%APPPATH%\httpd-2.4 SET PHP_DIR=%APPPATH%\php-%VERSION_NUMBER% SET PHP_MODULE=%PHP_DIR%\%DLL_NAME%.dll SET HTDOCS=%CD:Binaries=Cleopatra%\my-app SET FART_DIR=%APPPATH% SET PATH=%PHP_DIR%;%PATH% ECHO Updating httpd.conf configuration... DEL "%APACHE_DIR%\conf\httpd.conf" >NUL COPY "%APACHE_DIR%\conf\httpd.conf.bak" "%APACHE_DIR%\conf\httpd.conf" >NUL %FART_DIR%\fart -C -q "%APACHE_DIR%\conf\httpd.conf" "LoadModule PHP_MODULE" "LoadModule %MODULE_NAME% \"%PHP_MODULE:\=/%\"" %FART_DIR%\fart -C -q "%APACHE_DIR%\conf\httpd.conf" "c:/Apache24" %APACHE_DIR:\=/% %FART_DIR%\fart -C -q "%APACHE_DIR%\conf\httpd.conf" "${SRVROOT}/htdocs" %HTDOCS:\=/% %FART_DIR%\fart -C -q "%APACHE_DIR%\conf\httpd.conf" "PHP_DIR" %PHP_DIR:\=/% SET CAINFO=%PHP_DIR%\extras\ssl\cacert.pem ECHO Updating php.ini configuration... DEL "%PHP_DIR%\php.ini" >NUL COPY "%PHP_DIR%\php.ini.bak" "%PHP_DIR%\php.ini" >NUL %FART_DIR%\fart -q "%PHP_DIR%\php.ini" ";curl.cainfo =" "curl.cainfo = \"%CAINFO%\"" %FART_DIR%\fart -q "%PHP_DIR%\php.ini" "extension_dir = \"ext\"" "extension_dir = \"%PHP_DIR:\=/%/ext\" COPY "%PHP_DIR%\php.ini" "%APACHE_DIR%\conf\php.ini" > NUL ECHO Running Apache HTTP Server (with PHP v%VERSION_NUMBER%)... %APACHE_DIR%\bin\httpd.exe
On note que
- La librairie dynamique (DLL) utilisée avec apache est php8apache2_4
- Que la version de PHP est variabilisée afin de pouvoir vhanger le moteur facilement
- Que le module apache de PHP se nomme
php_module
alors qu’en php 6 ou 7 il se nommait respectivement php6_module et php7_module.
- Que le script est posé dans le répertoire veb afin de peuler correctement la variable APPPATH et les variables qui en découlens.
- Qu’on pourrait choisir de gérer tour le paramétrage par script comme l’est par exemple curl.cainfo mais que ça serait un peu plus fastidieux.
Vérifications
Dans le répertoire que vous avez choisi pour déposer vos scripts créez un fichier info.php comme suit
<?php
phpinfo();
Puis après avoir lancé le batch créé à l’étape précédente, visitez http://localhost/info.php
- Si vous voyez de l’information concenrant PHP alors apache est bien configuré.
- Si vous voyez de l’information concenrant la configuration OCI alors PHP est bien configuré.
- Si vous voyez de l’information concenrant la configuration de sqlite3 alors l’nevironnement est bien configuré.
Télécharger une version packagée
Des version packagées sont distribuées sur WebDelphes dans la section PPOWA. Ces versions sont livrées sans les binaires Oracle (Oracle ne l’autorise pas). C’est à vous d’aller les chercher.