Apache/OCI8-Erweiterungsmodule für PHP bauen

aus openSUSE, der freien Wissensdatenbank


Inhaltsverzeichnis

Einführung


Dies ist eine Anleitung (mini-howto) wie man die OCI8 Extension für PHP baut. Diese wird benötigt um Verbindung mit einem Oracle Server aufzunehmen

Danksagungen und Vorraussetzungen sind den einzelnen Abschnitten zu entnehmen.

Danksagungen


  • Benutzen von Pear um OCI8 zu bauen
Ursprünglicher Autor : Michael Galloway (mgx_at_ornl.gov)
Ursprünglicher Link : http://lists.suse.com/archives/suse-oracle/2007-Apr/0005.html
Die Anleitung wurde mit openSuSE-10.2 auf den Architekturen x86_32 und x86_64 geprüft

Vorrausetzungen


  • Nutzung von Pear um OCI8 zu bauen :: Benötigte Software
Liste der benötigten Software:
(Alle Software kann auf den openSuSE-10.2 Installationsmedian bzw. Repositories gefunden werden)
  • autoconf
  • php5-5.2.0-12
  • apache2-mod_php5-5.2.0-12
  • php5-pdo-5.2.0-10
  • php5-devel-5.2.0-12
  • php5-pear-5.2.0-12

Anleitung im Detail


Nutzung von Pear zum Bauen von OCI8


Die OCI8 Extension kann via PEAR und PECL heruntergeladen und gebaut werden. Diese Anleitung wurde mit openSuse 10.2 (x86_64) durchgeführt. Der Vorteil dieser Vorgehensweise ist die Verwendung von Standardpaketen.

Die folgenden Schritte benötigen Root-Rechte.

Installation der benötigten PHP und PEAR Pakete


Es wird angenommen das die Benötigte Software bereits installiert wurde. Eine Anleitung wie bei OpenSuSE Software installiert werden kann finden Sie hier: YaST_Software_Management

Installation des Oracle Instant Clients


Anmerkung:

Falls Sie Oracle auf dem selben Server wie Apache und PHP betreiben kann dieser Schritt übersprungen werden da die benötigten Bibliotheken bereits installiert sind.

  • Laden Sie den "Instant Client for Oracle" hier herunter, achten Sie darauf die richtige Version für Ihr System zu wählen (x86-32, x86-64 etc.)
  • Kopieren Sie die Zip Dateien nach /opt/oracle
  • Packen Sie die folgenden Dateien wie unterstehend aus:
 $ cd /opt/oracle
 $ unzip instantclient-basic-linux-*.zip
 $ unzip instantclient-sdk-linux-*.zip 
  • Nach dem Auspacken sieht das Verzeichnis wie folgt aus:
$ pwd
/opt/oracle/instantclient_10_2
$ ls -l
total 99900
-r--r--r-- 1 root root 1600090 2006-12-20 10:35 classes12.jar
-rwxr-xr-x 1 root root 66545 2006-12-20 10:35 genezi
lrwxrwxrwx 1 root root 17 2007-04-03 12:11 libclntsh.so -> libclntsh.so.10.1
-rwxr-xr-x 1 root root 20870419 2006-12-20 10:35 libclntsh.so.10.1
-rwxr-xr-x 1 root root 3808761 2006-12-20 10:35 libnnz10.so
-rwxr-xr-x 1 root root 1664148 2006-12-20 10:35 libocci.so.10.1
-rwxr-xr-x 1 root root 72456247 2006-12-20 10:35 libociei.so
-rwxr-xr-x 1 root root 137905 2006-12-20 10:35 libocijdbc10.so
-r--r--r-- 1 root root 1545954 2006-12-20 10:35 ojdbc14.jar
drwxr-xr-x 4 root root 4096 2006-12-20 10:35 sdk 
  • Erstellen Sie einen Symlink für libclntsh.so.10.1
 $ cd /opt/oracle/instantclient_10_2
 $ ln -s libclntsh.so.10.1 libclntsh.so

Konfiguration der Oracle Umgebung


Anmerkung: Wenn Sie planen oci8 auf einer anderen Maschine als Ihrem Oracle Server zu installieren kann dieser Schritt übersprungen werden.

Wenn Sie oci8 auf dem Oracle Server installieren möchten, also für die Datenbank und Apache den selben Server verwenden, gehen Sie folgendermassen vor:

  • Stellen Sie fest ob die Umgebungsvariable ORACLE_HOME gesetzt ist
 $ echo $ORACLE_HOME
Falls die Ausgabe ein Pfad enthält kann der nächste Schritt entfallen
  • Wenn der letze Schritt keine Ausgabe erbrachte, muss die Variable ORACLE_HOME entsprechend Ihrer Oracle Installation angepasst werden. Mit der Bash als Shell kann dies wie folgt bewerkstelligt werden:
 $ ORACLE_HOME=/path/to/oracle/database/server
 $ export ORACLE_HOME

Bauen, Installieren und aktivieren der OCI8 Extension


  • OCI8 können Sie hierherunterladen
  • Kopieren Sie die Datei nach /opt/oracle.
  • Rufen Sie folgende Befehle auf:
 $ cd /opt/oracle
 $ pear5 install oci8-1.2.3.tgz
Die Ausgabe sieht folgendermassen aus:
...
10 source files, building
running: phpize
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
Please provide the path to ORACLE_HOME dir. Use 'instantclient,/path/to/instant/client/lib'
if you're compiling against Oracle Instant Client [autodetect] :
Die oci8 Installation-Dialog fragt nach dem Pfad in dem der "instant clien"t installiert wurde, z.B.
 instantclient,/opt/oracle/instantclient_11_1
Falls Sie den Oracle Server verwenden und die Umgebungsvariable ORACLE_HOME gesetzt haben, reicht es ENTER zu drücken.
  • Und weiter gehts ...
building in /var/tmp/pear-build-root/oci8-1.2.3
running: /tmp/pear/cache/oci8-1.2.3/configure --with-oci8=instantclient,/opt/instantclient_10_2
checking for grep that handles long lines and -e... /usr/bin/grep

.......

/bin/sh /var/tmp/pear-build-root/oci8-1.2.3/libtool --mode=install cp ./oci8.la 
/var/tmp/pear-build-root/oci8-1.2.3/modules
cp ./.libs/oci8.so /var/tmp/pear-build-root/oci8-1.2.3/modules/oci8.so
cp ./.libs/oci8.lai /var/tmp/pear-build-root/oci8-1.2.3/modules/oci8.la
PATH="$PATH:/sbin" ldconfig -n /var/tmp/pear-build-root/oci8-1.2.3/modules
----------------------------------------------------------------------
Libraries have been installed in:
   /var/tmp/pear-build-root/oci8-1.2.3/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.
(It is safe to ignore warnings about tempnam and tmpnam).

running: make INSTALL_ROOT="/var/tmp/pear-build-root/install-oci8-1.2.3" install
Installing shared extensions: 
/var/tmp/pear-build-root/install-oci8-1.2.3/usr/lib64/php5/extensions/running:
find "/var/tmp/pear-build-root/install-oci8-1.2.3" -ls
901127 4 drwxr-xr-x 3 root root 4096 Apr 3 13:59 /var/tmp/pear-build-root/install-oci8-1.2.3
901156 4 drwxr-xr-x 3 root root 4096 Apr 3 13:59 /var/tmp/pear-build-root/install-oci8-1.2.3/usr
901157 4 drwxr-xr-x 3 root root 4096 Apr 3 13:59 
/var/tmp/pear-build-root/install-oci8-1.2.3/usr/lib64
901158 4 drwxr-xr-x 3 root root 4096 Apr 3 13:59 
/var/tmp/pear-build-root/install-oci8-1.2.3/usr/lib64/php5
901159 4 drwxr-xr-x 2 root root 4096 Apr 3 13:59 
/var/tmp/pear-build-root/install-oci8-1.2.3/usr/lib64/php5/extensionsld process completed 
successfully
Installing '/var/tmp/pear-build-root/install-oci8-1.2.3//usr/lib64/php5/extensions/oci8.so'
install ok: channel://pecl.php.net/oci8-1.2.3
You should add "extension=oci8.so" to php.ini 
  • Öffnen Sie die php.ini mit einem Texteditor und fügen Sie die Zeile "extension=oci8.so" ein
 $ cd /etc/php5/apache2/
 $ emacs php.ini
Dasselbe für die php.ini im CLI Verzeichnis
 $ cd /etc/php5/cli/
 $ emacs php.ini
  • Setzen der Umgebungsvariable LD_LIBRARY_PATH zum Oracle instant client Verzeichnis
 $ LD_LIBRARY_PATH=/opt/oracle/instantclient_10_2
Falls Sie den Oracle Server verwenden, schaut die Variable etwa so aus:
 $ LD_LIBRARY_PATH=$ORACLE_HOME/lib
  • Apache2 neu starten
 $ rcapache2 restart

Überprüfung der oci8 Installation


  • Überprüfen Sie ob die Installation korrekt verlief und die Extension aktiviert wurde. Sie können dies mit einem Aufruf der Funktion phpinfo() durchführen:
 $ php /usr/share/doc/packages/php5/test.php5 | grep oci8
oci8
oci8.default_prefetch => 10 => 10
oci8.max_persistent => -1 => -1
oci8.old_oci_close_semantics => 0 => 0
oci8.persistent_timeout => -1 => -1
oci8.ping_interval => 60 => 60
oci8.privileged_connect => Off => Off
oci8.statement_cache_size => 20 => 20
  • Falls Sie eine Fehlermeldung im Stil von "libnnz11.so: cannot open shared object file: No such file or directory in Unknown on line 0" erhalten stimmen die Umgebungsvariabeln nicht und müssen gesetzt oder angepasst werden.
export LD_LIBRARY_PATH=/opt/oracle/instantclient_11_1:$LD_LIBRARY_PATH

Das Ganze muss natürlich global gesetzt werden:

/etc/profile

Fügen Sie die folgende Zeilen hinzu:

 LD_LIBRARY_PATH=/opt/oracle/instantclient_11_1:$LD_LIBRARY_PATH
 export LD_LIBRARY_PATH
 
  • Die Überprüfung der Verbindung zu einem entfernten Oracle 10G Server können Sie mit dem unten stehenden Script durchführen. Setzen Sie die "OCILogon" und "$query" Parameter entsprechend Ihrer Datenbank Konfiguration.
<?php

$conn = OCILogon("dbuser", "dbpasswd", "//dbserver.host.net/DB");

$query = 'select table_name from user_tables';

$stid = OCIParse($conn, $query);
OCIExecute($stid, OCI_DEFAULT);
 while ($succ = OCIFetchInto($stid, $row)) {
    foreach ($row as $item) {
      echo $item." ";
    }
    echo "<br>\n";
 }

 OCILogoff($conn);

 ?>
Führen Sie das Script aus:
 $ php phpdb2.php

Zusammenfassung


Für die Ungeduldigen und Erfahrenen:

 $ unzip instantclient-basic-linux-x86-64-10.2.0.3-20070103.zip
 $ unzip instantclient-sdk-linux-x86-64-10.2.0.3-20070103.zip 
 $ pear5 install http://pecl.php.net/get/oci8 
 $ LD_LIBRARY_PATH=/path/to/instantclient/or/oracle/server/lib
 $ export LD_LIBRARY_PATH
 $ echo "extension=oci8.so" >> /etc/php5/apache2/php.ini
 $ echo "extension=oci8.so" >> /etc/php5/cli/php.ini
 $ rcapache2 restart

Zum Weiterlesen