Apache + php + OCI sous windows en mode portable

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.