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:
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
/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
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] : ...
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
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: