Benutzer-Werkzeuge

Webseiten-Werkzeuge


computer:linux:apache_mit_oracle_oci_unter_debian_linux

Dies ist eine alte Version des Dokuments!


A PCRE internal error occured. This might be caused by a faulty plugin

======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 [[computer:oracle_10g_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: <code> # apt-get install apache2 php5 php-pear php5-adodb php5-dev libapache2-mod-php5 make </code> Unter RPM-basierenden Systemen (SuSE, CentOS, RHEL) ist das meist: <code> </code> =====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: <code>echo 'source /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/oracle_env.sh' >> /etc/bash.bashrc</code> <note tip>Kommt es bei der Ausführung dieses Skriptes zum folgenden Fehler, muss das erwähnte Skript angepasst werden: <code> /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 </code> Betroffen sind die Zeilen 108 und 110 im besagtem Skript - sie müssen wie folgt abgeändert werden, um den Fehler zu beheben: <code> if [ -n "$LC_ALL" ]; then ... elif [ -n "$LANG" ]; then </code> </note> Damit das Modul später übersetzt werden kann, muss noch der Bibliotheken-Cache aktualisiert werden. Somit wird sichergestellt, dass die Oracle-Bibliotheken gefunden werden: <code> # echo "/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/lib" > /etc/ld.so.conf.d/oracle-xe.conf # ldconfig </code> ======Ü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: <code> # 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] : ... </code> <note>Der ORACLE_HOME-Pfad sollte bei bezogenem Oracle-Profil automatisch gefunden werden. Ein Druck auf Enter reicht aus.</note> Nach der Übersetzung wird für das übersetzte Modul eine Konfigurationsdatei erstellt: <code> # echo 'extension=oci8.so' > /etc/php5/conf.d/oci.ini </code> Das Modul benötigt die folgenden Umgebungsvariablen: * **ORACLE_HOME** * **NLS_LANG** * **LD_LIBRARY_PATH** 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: <code> 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:" </code> Nach einem Neustart des Webservers sollte alles funktionieren: <code> # service apache2 restart </code> ======Funktionstest====== Um die Funktion der Bibliothek zu testen, kann das folgende Skript verwendet werden: <code><?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); ?> </code> Nach Anpassung der folgenden Variablen sollte das Ganze sofort funktionieren: * **ora_host**: Hostname, auf dem sich die Datenbank/der Listener befindet * **ora_instance**: Name der Datenbank-Instanz * **ora_user**: Benutzername des zu verwendenden Datenbankbenutzers * **ora_pw**: Passwort des zu verwendenden Datenbankbenutzers

computer/linux/apache_mit_oracle_oci_unter_debian_linux.1330688636.txt.gz · Zuletzt geändert: 2012/03/02 12:43 von christian