Support Oracle OCI8 pour PHP

Procédure d’installation du module PHP OCI8 afin de permettre d’utiliser les connexions à une base de données Oracle en PHP.

Cette procédure se fait en 2 étapes, commencer par récupérer et installer les différents utilitaires pour la connexion à Oracle (utilitaires indépendant de PHP). Puis l’installation du module PHP OCI8.

Oracle Instant Client

Les différents utilitaires sont accessibles depuis la page https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html

Vous devrez récupérer au minimum :

Dans cet exemple, je vais placer les utilitaires dans le dossier /opt/oracle :

mkdir -p /opt/oracle
cd !$

On va dézipper les 2 archives obtenues :

unzip  /path/to/instantclient-basic-linux.x64-X.X.X.X.dbru.zip
unzip  /path/to/instantclient-sdk-linux.x64-X.X.X.X.dbru.zip

Vous devriez avoir dans votre dossier /opt/oracle un dossier instantclient_X_X

PHP7.3 OCI

LIBAIO1

On commence par installer la librairie libaio

$ apt install libaio

PECL

Pour l’installation du module OCI8 de PHP7.3, on va utiliser pecl

Pour installer PECL :

$ apt install php-pear
$ pecl version
  PEAR Version: 1.10.8
  PHP Version: 7.3.11-1+ubuntu18.04.1+deb.sury.org+1
  Zend Engine Version: 3.3.11
  Running on: Linux ED209 #67-Ubuntu SMP Thu Aug 22 16:55:30 UTC 2019 x86_64

Si vous êtes derrière un proxy, utilisez la commande pear config-set http_proxy http://<user>:<password>@<ip_proxy>:<port> pour régler le proxy utilisé par PEAR (il n’utilise pas le proxy système…)

PECL a besoin de phpize qui est inclus dans la librairie php7.3-dev pour compiler certains module (dont OCI8 qui nous interesse):

$ apt install php7.3-dev
$ phpize -v
Configuring for:
PHP Api Version:         20180731
Zend Module Api No:      20180731
Zend Extension Api No:   320180731

OCI8

pecl install oci8

Enfin, on installe OCI8. Vous devrez renseigner l’emplacement de l’instantclient installé à l’étape précédente :

la réponse sera : instantclient,/opt/oracle/instantclient_X_X

PHP.INI

On va maintenant activer le module PHP (OCI8) dans le PHP.INI. Pensez à le faire pour les PHP CLI et SERVEUR

# Extrait du fichier php.ini
;extension=interbase
;extension=ldap
;extension=mbstring
;extension=exif      ; Must be after mbstring as it depends on it
;extension=mysqli

# ON ACTIVE  OCI8
extension=oci8  ; Use with Oracle Database 12c Instant Client

;extension=odbc
;etc...

libnnz19.so !

Si vous testez la présence du module :

php -i | grep oci8

Vous devriez obtenir un warning concernant la librairie libnnz19.so :

PHP Warning:  PHP Startup: Unable to load dynamic library 'oci8' (tried: /usr/lib/php/20180731/oci8 (/usr/lib/php/20180731/oci8: cannot open shared object file: No such file or directory), /usr/lib/php/20180731/oci8.so (libnnz19.so: cannot open shared object file: No such file or directory)) in Unknown on line 0

Cette librairie est présente dans le dossier /opt/oracle/instantclient_X_X, et oci8.so en a besoin pour fonctionner :

# Voir les dépendances de OCI8.so avec la  commande LDD
$ ldd /usr/lib/php/20180731/oci8.so
	linux-vdso.so.1 (0x00007fff8c935000)
	libclntsh.so.19.1 => /opt/oracle/instantclient_19_3/libclntsh.so.19.1 (0x00007f8c6cff4000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8c6cc03000)
	libnnz19.so => not found
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8c6c9ff000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8c6c661000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8c6c442000)
	libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007f8c6c228000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f8c6c020000)
	libaio.so.1 => /lib/x86_64-linux-gnu/libaio.so.1 (0x00007f2714183000)
	libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f8c6be05000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f8c7122e000)
	libclntshcore.so.19.1 => not found

Vous pouvez utiliser les liens symboliques, ou ajouter au système une configuration pour lui préciser que le dossier /opt/oracle/instantclient_X_X contient des librairies dynamiques.

LD.CONF

Nous allons ajouter un fichier de configuration dans le dossier /etc/ld.so.conf.d/ pour indiquer au système l’emplacement de l’instantclient afin qu’il puisse trouver les librairies .so manquantes :

# Création du fichier /etc/ld/oci8.conf avec  l'emplacement du instantclient
echo "/opt/oracle/instantclient_19_3" >> /etc/ld.so.conf.d/oci8.conf

Maintenant, il faut recharger la configuration :

ldconf

On peut vérifier que tout est OK avec ldd :

#  Maintenant tout est OK
ldd /usr/lib/php/20180731/oci8.so
	linux-vdso.so.1 (0x00007ffc2e3f8000)
	libclntsh.so.19.1 => /opt/oracle/instantclient_19_3/libclntsh.so.19.1 (0x00007f2715aa1000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f27156b0000)
	libnnz19.so => /opt/oracle/instantclient_19_3/libnnz19.so (0x00007f2714f68000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2714d64000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f27149c6000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f27147a7000)
	libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007f271458d000)
	librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f2714385000)
	libaio.so.1 => /lib/x86_64-linux-gnu/libaio.so.1 (0x00007f2714183000)
	libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f2713f68000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f2719cdb000)
	libclntshcore.so.19.1 => /opt/oracle/instantclient_19_3/libclntshcore.so.19.1 (0x00007f27139c8000)