1. Contexte

Il existe 2 extensions permettant l'accès aux base Oracle de puis PHP:

Pour utiliser ces extensions, il est nécessaire de disposer de la bibliothèque cliente.

Il existe de nombreuses façons d'installer cette bibliothèque, y compris par RPM, cependant, il n'est pas possible de gérer proprement les dépendances du paquet fournissant l'extension, de ce fait on se retrouve souvent avec une extension inutilisable

$ php -v
PHP Warning:  PHP Startup: Unable to load dynamic library 'oci8' (tried: /usr/lib64/php/modules/oci8 (/usr/lib64/php/modules/oci8: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/oci8.so (libclntsh.so.21.1: cannot open shared object file: No such file or directory)) in Unknown on line 0

2. Installation de PHP et de l'extension

Pour une installation correcte de PHP, suivant les indications fournies par l'assistant de configuration.

Installer ensuite les extensions Oracle

# yum install php-oci8

3. Version du client

Pour connaitre la version de la bibliothèque, il suffit de consulter la description du paquet

$ yum info php-oci8
...
             : The extension is linked with Oracle client libraries 21.1
             : (Oracle Instant Client).  For details, see Oracle's note
             : "Oracle Client / Server Interoperability Support" (ID 207303.1).
             :
             : You must install libclntsh.so.21.1 to use this package, provided
             : in the database installation, or in the free Oracle Instant Client
             : available from Oracle.
...

Il s'agit donc actuellement de la version 21.1 qui permet l'accès aux bases en version 11.2 et supérieures

4. Utilisation du RPM

Le plus simple est d'utiliser le RPM de la bibliothèque fournit par Oracle

Téléchargement depuis: Oracle Instant Client Downloads

Actuellement, il faut prendre la paquet oracle-instantclient-basic-21.1.0.0.0-1.x86_64.rpm

Si il n'est pas déjà présent, il est aussi nécessaire d'installer le paquet libnsl (dépendance non gérée par le paquet fournit)

C'est suffisant, et pour vérifier

$ php --ri oci8

oci8

OCI8 Support => enabled
OCI8 DTrace Support => enabled
OCI8 Version => 2.2.0
Oracle Run-time Client Library Version => 21.1.0.0.0
Oracle Compile-time Instant Client Version => 21.1

5. Installation manuelle

Dans les cas plus complexes, par exemple si une autre version du serveur est déjà installée sur la même machine, ou si vous souhaitez utiliser la bibliothèque déjà présente sur le système, il est nécessaire de configurer le chemin de recherche.

Example, installation de instantclient-basic-linux.x64-21.1.0.0.0dbru.zip dans /opt

# mkdir /opt/oracle; cd /opt/oracle
# unzip /tmp/instantclient-basic-linux.x64-21.1.0.0.0.zip

5.1 chemin par défaut

Si il s'agit de la seule version présente sur le système, le plus simple consiste à ajouter le dossier au chemin de recherche par défaut, qui sera utilisé par tous les utilisateurs, et tous les services

# echo "/opt/oracle/instantclient_21_1" >/etc/ld.so.conf.d/oracle.conf
# ldconfig

5.2 chemin spécifique

Si vous préférez position pour chaque utilisateur (cas le plus complexe)

En ligne de commande

$ export LD_LIBRARY_PATH=/opt/oracle/instantclient_21_1

Pour les serveurs web, httpd (si vous utilisez encore mod_php) ou php-fpm, il faut modifier l'environnement du service en surchargeant le fichier de lancement

# systemctl edit php-fpm

Et ajouter les lignes

[Service]
Environment=LD_LIBRARY_PATH=/opt/oracle/instantclient_21_1

Il peut aussi être nécessaire de positioner, dans la configuration du pool FPM :

clear_env = no

6. Autres

6.1 tnsnames.ora

Si vous utilisez ce fichier pour la configuration des SID (optionel avec EasyConnect), vous devez ajouter son chemin dans l'environment d'httpd ou de php-fpm

# systemctl edit php-fpm

Et ajouter les lignes

[Service]
Environment=TNS_ADMIN=/path/to/network/admin

6.2 SELinux

Lorsque l'accès à la base utilise le réseau, il faut l'autoriser explicitement

# setsebool -P httpd_can_network_connect on

6.3 Serveur web

Comme pour l'installation de chaque nouvelle extension, ne pas oublier de relancer le serveur web (httpd)  ou le service FPM (php-fpm).

7. Conclusion

Pour mémoire, j'ai commencé à fabriquer mes RPM de PHP il y a maintenant plus de 15 ans, justement pour avoir ces extensions.

Leur installation n'a jamais été simple, en particulier à cause de cette impossibilité de gérer proprement les dépendances ou de fournir mes propres paquets à cause de la Licence Oracle.

Avec ces quelques notes, j'espère que cela sera désormais plus simple et plus clair.

Lors d'une mise à jour de PHP, pensez à vérifier si la version de la bibliothèque utilisée n'a pas changée.