Installer et configurer linux pour se connecter à Oracle avec PHP

Il existe une multitude de moyens pour développer des applications PHP pour Oracle, si vous souhaitez ensuite les mettre à disposition facilement c’est une autre histoire, à moins bien sûr de les livrer sous forme de machines virtuelle.

Cet article décrit pas à pas la démarche qui vous permettra de configurer une machine virtuelle Centos7 contenant un serveur Apache/PHP capable de se connecter à une base Oracle distante.

La version de machine virtuelle sur laquelle je travaille au départ est une installation Centos7 minimale à laquelle j’ai ajouté les outils et bibliothèques de développement. Les ports réseaux de la VM sont configuré en mode bridge sur la carte réseau que j’utilise et le mode DHCP a été choisi pour l’attribution des adresses IP.

Toutes les instructions passées le sont par l’utilisateur root.

Afin de me faciliter la tâche je me suis installé des outils de base qui ne sont pas installés par défaut, net-tools (ifconfig, netstat …) et vim.

yum install net-tools
yum install vim

Installation du serveur apache et de PHP (les modules PHP-devel et PHP-pear permettent l’utilisation de PECL qui est un gestionnaire de package pour PHP):

yum install httpd
yum install php
yum install php-devel
yum install php-pear

Afin de se connecter à Oracle et de tester j’installe l’instant client oracle 11g1, les bibliothèques de développement correspondantes dont les paquets rpm peuvent être téléchargés depuis le site d’oracle ainsi que SQL*plus pour effectuer des tests unitaires. après les avoir chargés sur ma VM je les installe avec les commandes suivantes :

yum localinstall oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
yum localinstall oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm
yum localinstall oracle-instantclient11.2-sqlplus-11.2.0.4.0-1.x86_64.rpm

J’informe le système afin de lui indiquer où se trouvent les bibliothèques Oracle

export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib

cd /etc/ld.so.conf.d/
vi instantclient-11g.x86_64.conf

Le contenu du fichier instantclient-11g.x86_64.conf est le suivant après édition :

/usr/lib/oracle/11.2/client64/lib
/usr/lib/oracle/11.2/client64

J’utilise ensuite PECL pour installer la bibliothèque OCI8 pour PHP

pecl install oci8

Je configure ensuite PHP pour qu’il puisse travailler avec le module OCI8

cd /etc/php.d
vim oci8.ini

Le contenu du fichier oci8.ini est alors le suivant

; Enable oci8 extension module
extension=oci8.so

Et je configure le comportement par défaut OCI8.

cd /etc
vim php.ini

La section concerant OCI8 du fichier php.ini devient alors la suivante (il s’agit là de mon choix de configuration):

[OCI8]
; credentials (OCI_SYSOPER, OCI_SYSDBA)
; http://php.net/oci8.privileged-connect
oci8.privileged_connect = Off
; Connection: The maximum number of persistent OCI8 connections per
; http://php.net/oci8.max-persistent
oci8.max_persistent = -1
; http://php.net/oci8.persistent-timeout
oci8.persistent_timeout = -1
; ping during oci_pconnect() to check the connection validity. When
; set to 0, each oci_pconnect() will cause a ping. Using -1 disables
; http://php.net/oci8.ping-interval
oci8.ping_interval = 60
;oci8.connection_class =
oci8.events = Off
; http://php.net/oci8.statement-cache-size
oci8.statement_cache_size = 256
; http://php.net/oci8.default-prefetch
oci8.default_prefetch = 1024
; Compatibility. Using On means oci_close() will not close
; oci_connect() and oci_new_connect() connections.
; http://php.net/oci8.old-oci-close-semantics
oci8.old_oci_close_semantics = Off

Je configure ensuite SELINUX afin que le serveur http soit autorisé à émettre une connexion externe d’une part et de l’autoriser à écrire dans un répertoire (qui doit exister) en l’occurrence /var/www/html/config

setsebool -P httpd_can_network_connect on
chown -R apache /var/www/*
chcon -R -t httpd_sys_content_rw_t /var/www/html/config

J’ouvre ensuite le firewall

firewall-cmd --zone=public --add-port=http/tcp
firewall-cmd --zone=public --add-port=http/tcp --permanent

Et je lance mon serveur httpd

systemctl start httpd.service

Je dois pouvoir vous connecter au port 80 de mon serveur, dont j’ai eu l’adresse en tapant, au choix ifconfig ou ip addr sur votre VM depuis un serveur distant.


  1. Au moment où l’article est écrit, c’est la version 5.4.16 de PHP qui est livrée en paquet rpm, elle ne fonctionne pas avec l’instant client 12c mais fonctionne bien avec l’instant client 11g.