Inhaltsverzeichnis

Vorbereitungen

Eine Vorraussetzung ist, dass Debian Linux installiert und aktualisiert wurde - es ist wichtig, dass alle verfügbaren Updates installiert wurden.

Ebenso wichtig ist, dass Oracle Database Express Edition installiert wurde - oder, dass der Host über Konnektivität zu einer solchen Datenbank verfügt. Hierfür müssen ggf. Firewall-Regeln angepasst werden. Die Installation von Oracle Database Express Edition auf Debian Linux wird in einem anderen Artikel erläutert.

Benötigt werden noch einige Pakete, wie beispielsweise PHP und Bibliotheken zur Übersetzung eigener PHP-Module. Unter Debian/GNU basierenden Systemen sollten das sein:

# apt-get install apache2 php5 php-pear php5-adodb php5-dev libapache2-mod-php5 make

Unter RPM-basierenden Systemen (SuSE, CentOS, RHEL) ist das meist:



Oracle

Damit Benutzerkonten, wie beispielsweise auch der Apache-Webserver, mittels SQLPlus Verbindungen herstellen können, empfiehlt es sich das Oracle-Umgebungsskript in das globale Bash-Profil zu laden:

echo 'source /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/oracle_env.sh' >> /etc/bash.bashrc

Kommt es bei der Ausführung dieses Skriptes zum folgenden Fehler, muss das erwähnte Skript angepasst werden:

/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/nls_lang.sh: 114: [[: not found
/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/nls_lang.sh: 114: [[: not found

Betroffen sind die Zeilen 108 und 110 im besagtem Skript - sie müssen wie folgt abgeändert werden, um den Fehler zu beheben:

if [ -n "$LC_ALL" ]; then
   ...
elif [ -n "$LANG" ]; then

Damit das Modul später übersetzt werden kann, muss noch der Bibliotheken-Cache aktualisiert werden. Somit wird sichergestellt, dass die Oracle-Bibliotheken gefunden werden:

# echo "/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/lib" > /etc/ld.so.conf.d/oracle-xe.conf
# ldconfig

Übersetzung von OCI

Für PHP gibt es ein Modul namens OCI. Dieses Modul wird mit den Oracle-Bibliotheken, die dem Database Server oder den Instant-Client (bei getrennten Systemen) beiliegen, übersetzt. Dieses Modul wird von PHP verwendet, um mit der Datenbank zu kommunizieren.

Der Sourcecode des Moduls wird heruntergeladen und mithilfe von Pear übersetzt:

# cd /usr/src
# w3m http://pecl.php.net/get/oci8
# pear install oci8-1.2.3.tgz
...
10 source files, building
running: phpize
Configuring for:
PHP Api Version:         20090626
Zend Module Api No:      20090626
Zend Extension Api No:   220090626
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] :
...

Der ORACLE_HOME-Pfad sollte bei bezogenem Oracle-Profil automatisch gefunden werden. Ein Druck auf Enter reicht aus.

Nach der Übersetzung wird für das übersetzte Modul eine Konfigurationsdatei erstellt:

# echo 'extension=oci8.so' > /etc/php5/conf.d/oci.ini

Das Modul benötigt die folgenden Umgebungsvariablen:

Apache ist in der Regel auf Debian aus Sicherheitsgründen so konfiguriert, dass diese Variablen händisch dem Dienst übergeben werden müssen. Hierfür muss die Datei /etc/apache2/envvars um entsprechende Zeilen, die die eben erwähnten Variablen inklusive Werte erweitert werden. Die Werte der Variablen lassen sich ganz einfach mit env herausfinden. In meinem Beispiel mussten folgende Zeilen eingefügt werden:

export ORACLE_SID="XE"
export ORACLE_HOME="/usr/lib/oracle/xe/app/oracle/product/10.2.0/server"
export NLS_LANG="GERMAN_GERMANY.AL32UTF8"
export LD_LIBRARY_PATH="/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/lib:"

Nach einem Neustart des Webservers sollte alles funktionieren:

# service apache2 restart

Funktionstest

Um die Funktion der Bibliothek zu testen, kann das folgende Skript verwendet werden:

<?php

//Verbindungsdaten
$ora_host="localhost";
$ora_instance="XE";
$ora_string='//'.$ora_host.'/'.$ora_instance;
$ora_user="<Benutzername>";
$ora_pw="<Passwort>";

//Ausgeben der Umgebungsvariablen
echo "Environment:<br />";
echo "<b>ORACLE_HOME</b>=<i>".getenv("ORACLE_HOME")."</i><br>\n";
echo "<b>NLS_LANG</b>=<i>".getenv("NLS_LANG")."</i><br>\n";
echo "<b>LD_LIBRARY_PATH</b>=<i>".getenv("LD_LIBRARY_PATH")."</i><br>\n";

//Versuche, eine Verbindung herzustellen
$db_conn = ocilogon($ora_user, $ora_pw, $ora_string );
if (!$db_conn){
        echo "Verbindungsfehler!</p>";
}
else
{
        echo "Verbindung hergestellt!</p>";
}

//Alle Tabellen des Benutzers auflisten
$query = 'select table_name from user_tables';
$stid = OCIParse($db_conn, $query);
OCIExecute($stid, OCI_DEFAULT);
echo "<b>Tabellen:</b><br />";
while ($succ = OCIFetchInto($stid, $row)) {
foreach ($row as $item) {
echo "<i>".$item."</i><br />";
}
echo "\n";
}

//Verbindung zur Datenbank trennen
OCILogoff($conn);

?>

Nach Anpassung der folgenden Variablen sollte das Ganze sofort funktionieren: