1. Pré-requis

SELinux doit être désactivé. Lorsqu'il est activé, le chargement de la bibliothèque contenant les clients Oracle est refusé.

Visiter l'espace téléchargement du site Oracle pour télécharger le(s) RPM de l'Instant Client version 10.2.0.3.

A noter : c'est cette version qui a servi à la construction du RPM php-oci8, sa présence est donc indispensable même si vous disposez du client complet, ou de l'environnement serveur complet sur la machine. Cette version permet l'accès à toutes les versions (récentes) de serveur Oracle (testée avec Oracle 8i et Oracle 10g).

Adresse : http://www.oracle.com/technology/tech/oci/instantclient/instantclient.html.

Il est demandé de valider une licence et d'ouvrir un compte. Cette opération est gratuite pour une utilisation non commerciale.

Les RPM suivants sont disponibles :

  • oracle-instantclient-basic-10.2.0.3-1.i386.rpm (31 Mo) indispensable, il contient les bibliothèques du client.
  • oracle-instantclient-jdbc-10.2.0.3-1.i386.rpm (1,4 Mo) le pilote pour les développeurs Java (donc inutile dans notre cas)
  • oracle-instantclient-sqlplus-10.2.0.3-1.i386.rpm (0,7 Mo) si vous souhaitez pouvoir utiliser la commande sqlplus (SQL en ligne de commande).
  • oracle-instantclient-devel-10.2.0.3-1.i386.rpm (0,3 Mo) pour compiler des programmes, par exemple pour reconstruire le RPM de php-oci8.

Pour certaines versions (x86_64 en particulier), les RPM ne sont pas disponibles sur le site officiel, je vous invites donc à les construire vous même à partir de cette fiche explicative : Oracle Instant Client 10.2.0.3 on x86_64

Vous pouvez aussi utiliser le RPM client fournit dans Oracle Database 10g Express Edition

  • oracle-xe-client-10.2.0.1-1.0.i386.rpm (24 Mo)

2. Installation

Configurer mon dépôt, pour plus d'informations, lire : Configuration de YUM.

Installer le RPM de php-oci8 ainsi que les éventuelles dépendances (httpd, php, etc) à l'aide de yum :

yum  --enablerepo=remi  install  php-oci8  php-pdo

Si l'installation échoue à cause d'une dépendance sur la bibliothèque libclntsh.so.10.1 (non fournie pas les RPM d'Oracle), il faudra télécharger le RPM de php-oci8 et l'installer manuellement en ignorant les dépendances

yum  --enablerepo=remi  install  php-pdo
yum -ivh --nodeps php-oci8-*.rpm

3. Configuration

Il est nécessaire de modifier l'environnement du serveur apache afin qu'il trouve la bibiothèque fournie par l'Instant Client. Pour cela il faut ajouter au fichier /etc/sysconfig/httpd les lignes suivantes :

Pour oracle-instantclient-basic-10.2.0.3-1.i386.rpm :

Sous Fedora >= 16, avec systemd.

LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.3/client/lib
NLS_LANG=FRENCH_FRANCE.AL32UTF8
TNS_ADMIN=/etc/oracle

Sous Enterprise Linux ou Fedora <= 15 (sans systemd donc)

export LD_LIBRARY_PATH=/usr/lib/oracle/10.2.0.3/client/lib
export NLS_LANG=FRENCH_FRANCE.AL32UTF8
export TNS_ADMIN=/etc/oracle

Pour oracle-xe-client-10.2.0.1-1.0.i386.rpm :

export LD_LIBRARY_PATH=/usr/lib/oracle/xe/app/oracle/product/10.2.0/client/lib/
export NLS_LANG=FRENCH_FRANCE.AL32UTF8
export TNS_ADMIN=/etc/oracle
  • La variable LD_LIBRARY_PATH désigne le répertoire contenant le fichier libclntsh.so.10.1 utilisé par l'extension.
  • La variable NLS_LANG désigne le jeu de caractères utilisé. Vous pouvez bien sûr l'adapter à votre serveur.
  • La variable TNS_ADMIN désigne le répertoire contenant le fichier tnsnames.ora permettant la résolution locale des noms de bases de données. Vous pouvez utiliser le dossier $ORACLE_HOME/network/admin si vous disposez déjà d'un environnement client ou serveur complet, sinon la création du répertoire /etc/oracle me semble une bonne solution.

L'utilisation du fichier tnsnames.ora n'est pas nécessaire si vous utiliser la solution Easy Connect, sinon il faut le créer en recopiant celui du serveur.

A noter : si vous avez construit vos propres RPM, en suivant mes indications, à l'étape 1, la configuration du LD_LIBRARY_PATH n'est plus nécessaire.

4. Vérification

Relancez le serveur apache :

service httpd restart

Verifiez l'absence d'erreur dans le journal /var/log/httpd/error_log.

La fonction phpinfo() doit vous afficher une section Oci8 (vérifier que Oracle Instant Client Version = 10.2).

5. Utilisation

Connexion version Easy Connect

$conn = oci_connect("scott", "tigger", "//serveur.domaine.com/SID");
if ($conn ) {
echo "oci_connect Ok
";
oci_close($conn);
}
else echo " oci_connect ERREUR
";

Connexion version tnsnames.ora

$conn = oci_connect("scott", "tigger", "SID");
if ($conn ) {
echo "oci_connect Ok
";
oci_close($conn);
}
else echo " oci_connect ERREUR
";

Connexion avec les fonctions PDO

try {
$db = new PDO ("oci:dbname=//serveur.domaine.com/SID", "scott", "tigger");
printf("Connexion Ok
");
}
catch(PDOException $e) {
printf("ERREUR : %s
", $e->getMessage());
}

6. Exemple complet

Télécharger le fichier oracle.php (visualiser) et l'enregistrer sur le site web.

Editer ce fichier pour renseigner les variables de connexion (ADDR, USER, PASS et SID) avant de l'utiliser. Il utilise une petite requête sur la base de formation fournie avec les serveurs Oracle.

7. Remarques

Ne pas hésiter à m'envoyer des commentaires à l'adresse : fedora@FamilleCollet.com

J'essaierai d'intégrer la réponse à vos éventuelles questions afin de faciliter autant que possible les installation / configuration / utilisation de cette extension.