Installation des extensions Oracle pour PHP
+
Par Remi le lundi 18 mai 2020, 14:43 - HowTo - Lien permanent
Comme la question revient assez souvent, voici mes notes d'installation.
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.
Commentaires
Ces notes d'installation sont pour Fedora et RHEL / CentOS >= 7 (systemd)
Pour RHEL / CentOS 6, puisque la version 19.x nécessite glibc 2.14, la version de la bibliothèque utilisée est
Le configuration du chemin est obligatoire, même avec le RPM. Pour le serveur web il faut l'ajouter au fichier /etc/sysconfig/http.
La version 21.1 est désormais utilisée par les paquets récents de PHP, elle permet la connexion à Oracle Database 12.1 ou supérieure (11.2 fonctionne mais n'est pas officiellement supportée)
L'utilisation du RPM de Oracle Iinstant Client est désormais la seul méthode supportée (§4).
Il doit être installé avant l'extension PHP.