Installer le client Oracle sur Debian/Lenny, interco avec PHP

Dans la série j’installe des trucs pas vraiment packagés pour Debian, voici le client Oracle ; toujours dans l’optique de faire gagner du temps à ceux qui auraient à le faire.
Je n’ai pas trouvé de méthode bien propre sur Google. En mixant plusieurs docs qui sont des comptes-rendus d’install de cas particuliers, je pense avoir trouvé une méthode un peu générale, vu que je suis parti d’une machine vide. Quant au moteur de recherche d’infos sur oracle.com, j’ai vite renoncé.

Contexte

Un serveur Oracle sous Windows, quelque part. Une machine Linux sur laquelle je veux pouvoir faire tourner des scripts PHP (en ligne de commande et via apache) attaquant cette base, et faire du sqlplus « nativement » depuis cette machine.

Repos Debian VS .zip VS .rpm

Oracle propose un repo à l’adresse suivante : deb http://oss.oracle.com/debian unstable main non-free. Je n’ai pas ressenti le besoin de l’utiliser. Il m’a l’air d’être là pour l’installation d’Oracle XE, la version serveur gratuite, l’équivalent d’un MSQL Server Express chez Microsoft.
Ensuite, entre le ZIP et le RPM, j’ai opté pour les RPM. J’explique ci-dessous.

Au passage, si vous voulez voir le repository, ajoutez la signature suivante :

cd /tmp
wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle
apt-key add RPM-GPG-KEY-oracle

Installation des paquets

Dans mon cas, j’ai été cherché les paquets suivants – tous disponibles ici :

  • oracle-instantclient11.1-basic : la lib de connexion Oracle
  • oracle-instantclient11.1-devel : Le SDK, pour la suite, notamment construire le module php oci8
  • oracle-instantclient11.1-sqlplus : l’outil sqlplus

J’ai opté pour les versions RPM que j’ai converti via alien en .deb
Le seul intérêt est d’éviter de se demander où on doit mettre les fichiers qui sont livrés (en version ZIP) tous dans le même répertoire, (les lib, exe, etc). Pour autant, ça ne génère pas de script de pre/post-configuration qui auraient permis de positionner les variables habituelles Oracle (TNS_ADMIN par exemple), ce genre de manips.
Donc, après avoir installé les 3 .deb, il faut faire :

echo /usr/lib/oracle/11.1/client/lib >> /etc/ld.so.conf.d/oracle.conf
ldconfig -v # indique ces lib au linker ld.so
echo TNS_ADMIN=/etc/oracle >> /etc/environment
mkdir /etc/oracle # vous y stockerez le tnsnames.ora
aptitude install libaio1 # necessaire pour la comm. Oracle

Si vous n’installez pas « libaio1 », vous planterez car sqlplus en a besoin, voyez :

serveur:/# ldd `which sqlplus`
        linux-gate.so.1 =>  (0xb7fa3000)
        libsqlplus.so => /usr/lib/oracle/11.1/client/lib/libsqlplus.so (0xb7ef6000)
        libclntsh.so.11.1 => /usr/lib/oracle/11.1/client/lib/libclntsh.so.11.1 (0xb63aa000)
        libnnz11.so => /usr/lib/oracle/11.1/client/lib/libnnz11.so (0xb61fd000)
        libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb61f9000)
        libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb61d3000)
        libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb61ba000)
        libnsl.so.1 => /lib/i686/cmov/libnsl.so.1 (0xb61a1000)
        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb6046000)
        libaio.so.1 => /lib/libaio.so.1 (0xb6043000)
        /lib/ld-linux.so.2 (0xb7fa4000)

Enfin, il faut renseigner votre fichier tnsnames.ora de description de vos bases, exemple :

serveur:/# cat /etc/oracle/tnsnames.ora
# Generated by ma main
MaBase =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.x.y)(PORT = 1522))
    )
    (CONNECT_DATA =
      (SID = MON_SID)
    )
  )

A ce niveau là, sqlplus devrait fonctionner, testez via :

sqlplus login/pass@MaBase

Bien sûr, vous vous êtes reloggué pour bénéfichier de la variable d’environnement TNS_ADMIN 😉

Partie PHP pure

Il faut installer 2/3 compléments à PHP si ce n’est déjà fait, à savoir les paquets php5-dev, php-pear et enfin ajouter « l’extension oci8 » pour prendre en charge les connexions Oracle.
Faites-vous un script appelant phpinfo() pour voir qu’il manque l’extension « oci8 ».
Pour l’installer, on utilise « pecl » (cet outil permet d’aller chercher des extensions PHP que votre distribution n’aurait pas pré-packagé, un peu comme les modules PERL qu’on trouve chez cpan.org et qu’on installe en ligne de commande via « cpan » (si je me souviens bien ;)) et les compile sur votre système, automagiquement.
On tape donc :

pecl install oci8

Ca mouline, et si ça n’insulte pas, alors on est bon :

serveur:~/pecl# pecl install oci8
downloading oci8-1.3.5.tgz ...
Starting to download oci8-1.3.5.tgz (137,987 bytes)
........................done: 137,987 bytes
10 source files, building
running: phpize
Configuring for:
PHP Api Version:         20041225
Zend Module Api No:      20060613
Zend Extension Api No:   220060519
 1. Please provide the path to the ORACLE_HOME directory. Use 'instantclient,/path/to/instant/client/lib' if you're compiling with Oracle Instant Client : autodetect

1-1, 'all', 'abort', or Enter to continue:
building in /var/tmp/pear-build-root/oci8-1.3.5
running: /tmp/pear/temp/oci8/configure --with-oci8
checking for grep that handles long lines and -e... /bin/grep
[...]
configure: WARNING: You will need re2c 0.12.0 or later if you want to regenerate PHP parsers.
[...]
configure: WARNING: OCI8 extension: ORACLE_HOME is not set, looking for default Oracle Instant Client instead
[...]
checking whether to build static libraries... no
configure: creating libtool
appending configuration tag "CXX" to libtool
appending configuration tag "F77" to libtool
configure: creating ./config.status
config.status: creating config.h
running: make
/bin/sh /var/tmp/pear-build-root/oci8-1.3.5/libtool --mode=compile gcc  -I. -I/tmp/pear/temp/oci8 -DPHP_ATOM_INC -I/var/tmp/pear-build-root/oci8-1.3.5/include -I/var/tmp/pear-build-root/oci8-1.3.5/main -I/tmp/pear/temp/oci8 -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/oracle/11.1/client  -DHAVE_CONFIG_H  -g -O2   -c /tmp/pear/temp/oci8/oci8.c -o oci8.lo
mkdir .libs
gcc -I. -I/tmp/pear/temp/oci8 -DPHP_ATOM_INC [...]
[...]
gcc -shared  .libs/oci8.o .libs/oci8_lob.o .libs/oci8_statement.o .libs/oci8_collection.o .libs/oci8_interface.o  -L/usr/lib/oracle/11.1/client/lib -lclntsh  -Wl,-rpath -Wl,/usr/lib/oracle/11.1/client/lib -Wl,-soname -Wl,oci8.so -o .libs/oci8.so
creating oci8.la
(cd .libs && rm -f oci8.la && ln -s ../oci8.la oci8.la)
/bin/sh /var/tmp/pear-build-root/oci8-1.3.5/libtool --mode=install cp ./oci8.la /var/tmp/pear-build-root/oci8-1.3.5/modules
cp ./.libs/oci8.so /var/tmp/pear-build-root/oci8-1.3.5/modules/oci8.so
cp ./.libs/oci8.lai /var/tmp/pear-build-root/oci8-1.3.5/modules/oci8.la
PATH="$PATH:/sbin" ldconfig -n /var/tmp/pear-build-root/oci8-1.3.5/modules
----------------------------------------------------------------------
Libraries have been installed in:
   /var/tmp/pear-build-root/oci8-1.3.5/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Build complete.
Don't forget to run 'make test'.

running: make INSTALL_ROOT="/var/tmp/pear-build-root/install-oci8-1.3.5" install
Installing shared extensions:     /var/tmp/pear-build-root/install-oci8-1.3.5/usr/lib/php5/20060613+lfs/
running: find "/var/tmp/pear-build-root/install-oci8-1.3.5" -ls
 65412    4 drwxr-xr-x   3 root     root         4096 May  7 10:08 /var/tmp/pear-build-root/install-oci8-1.3.5
 65441    4 drwxr-xr-x   3 root     root         4096 May  7 10:08 /var/tmp/pear-build-root/install-oci8-1.3.5/usr
 65442    4 drwxr-xr-x   3 root     root         4096 May  7 10:08 /var/tmp/pear-build-root/install-oci8-1.3.5/usr/lib
 65443    4 drwxr-xr-x   3 root     root         4096 May  7 10:08 /var/tmp/pear-build-root/install-oci8-1.3.5/usr/lib/php5
 65444    4 drwxr-xr-x   2 root     root         4096 May  7 10:08 /var/tmp/pear-build-root/install-oci8-1.3.5/usr/lib/php5/20060613+lfs
 65440  408 -rwxr-xr-x   1 root     root       411611 May  7 10:08 /var/tmp/pear-build-root/install-oci8-1.3.5/usr/lib/php5/20060613+lfs/oci8.so

Build process completed successfully
Installing '/usr/lib/php5/20060613+lfs/oci8.so'
install ok: channel://pecl.php.net/oci8-1.3.5
configuration option "php_ini" is not set to php.ini location
You should add "extension=oci8.so" to php.ini

On peut donc ajouter l’extension oci8 à PHP, via un fichier habituellement placé ici :

serveur:/# cat /etc/php5/conf.d/oracle.ini
extension=oci8.so

Normalement, votre script phpinfo() devrait vous indiquer votre extension oci8. Cool.

Partie PHP depuis apache

J’ai un peu tourné en rond pour cette partie. La difficulté est de faire bouffer le fichier tnsnames.ora à Apache pour les scripts PHP. Car tout le boulot a été fait aux étapes d’avant.
J’ai testé des SetEnv TNS_ADMIN dans /etc/apache2/httpd.conf, mais rien, il s’en fout.
Apparement, il faut que l’environnement où s’exécute Apache (en tant que www-data) contienne TNS_ADMIN. Donc, il a fallu l’ajouter dans /etc/apache2/envvars, après la partie standard qu’il contenait :

serveur:/# cat /etc/apache2/envvars
# envvars - default environment variables for apache2ctl

# Since there is no sane way to get the parsed apache2 config in scripts, some
# settings are defined via environment variables and then used in apache2ctl,
# /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
export APACHE_PID_FILE=/var/run/apache2.pid

export TNS_ADMIN=/etc/oracle

Un restart (reload pas suffisant) d’Apache et hop, un script PHP qui passait en ligne de commande, mais pas depuis Apache (erreur ORA-12154), fonctionne maintenant

Ca roule.
Vu que j’ai beaucoup tourné en rond, j’espère avoir bien enlevé les manips inutiles et pas oublié de manip indispensable

8 comments

  1. Trés bon tutorial, détaillé juste ce qu’il faut, avec presque tout ce qu’il faut.

    Pour vérifier que les variables d’environnement sont bien chargées dans apache, il faut regarder dans la section « Environment » de phpinfo() : elles doivent y apparaitre.

    J’ai du déclarer les variables d’environnement dans le fichier /etc/apache2/envvars !! Dans /etc/environement ca ne marchait pas. À noter que le script d’installation des librairies avait déjà rajouté la ligne ‘TNS_ADMIN’ dans le ficheir envvars.

    Pour info voici le contenu de envvars, avec d’autres paramètres pour oracle :
    *******
    export APACHE_RUN_USER=www-data
    export APACHE_RUN_GROUP=www-data
    export APACHE_PID_FILE=/var/run/apache2.pid
    export TNS_ADMIN=/etc/oracle
    export ORACLE_HOME=/usr/lib/oracle/10.2.0.4/client/lib
    export NLS_LANG=FRENCH_FRANCE.WE8ISO8859P1
    export NLS_NUMERIC_CHARACTERS=.,
    export NLS_LANG=french_france.we8iso8859p1
    *****
    Le paramètre NLS_LANG est crucial si vous avez à travailler avec une base oracle créé par un gars qui y mis des majuscules avec accents dans le nom des champs….

    Ma config pour info : Debian Lenny 5.1, les librairies en version 10.2 pour un serveur oracle 8.

  2. Hop, je réutilise cet article pour installer la même chose mais en 64 bits. Même topo, sauf que sqlplus s’appelle sqlplus64… à vous de faire un lien, un /etc/alternatives, peu importe.

    update-alternatives –install /usr/bin/sqlplus sqlplus `which sqlplus64` 10

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.