Mit OCI8-Funktionen in PHP zu arbeiten, ist nicht ganz so einfach. Zuerst braucht ihr natürlich einen Oracle-Server. Das geht am besten mit Virtualbox, hier findet ihr eine Anleitung. Ihr könnt den Oracle-Server praktisch schon starten, da ihr noch seine IP-Adresse für das Test-Script nachher benötigt.

Dann braucht ihr PHP7 mit OCI8, dass geht wohl am besten mit Debian unter Docker. Das Modul php_oci8 wird aber unter Debian nicht mitgeliefert, es muss als Modul erstellt werden. Dafür benötigen wir von Oracle einen Install-Client:

  • Site: https://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html
  • Datei: instantclient-basic-linux.x64-12.2.0.1.0.zip
  • Datei: instantclient-sdk-linux.x64-12.2.0.1.0.zip

Nun können wir uns einen Container bauen. Ich habe mir dafür ein Dockerfile erstellt. Am besten packt ihr alle Dateien in einen Ordner:

# debian9
FROM debian:stretch

RUN apt-get update && apt-get -y upgrade && DEBIAN_FRONTEND=noninteractive apt-get -y install \
    apache2 libapache2-mod-php php-dev php-pear build-essential libaio1 unzip vim

#
# install oracle
#

ADD instantclient-basic-linux.x64-12.1.0.2.0.zip /opt/instantclient-basic-linux.x64-12.1.0.2.0.zip
ADD instantclient-sdk-linux.x64-12.1.0.2.0.zip /opt/instantclient-sdk-linux.x64-12.1.0.2.0.zip
ADD make_oracle.sh /root/make_oracle.sh
RUN . /root/make_oracle.sh
RUN phpenmod oci

ADD info.php /var/www/html/info.php
ADD test.php /var/www/html/test.php

# Manually set up the apache environment variables
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_RUN_DIR   /var/run/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid

# Expose apache.
EXPOSE 80

# By default start up apache in the foreground, override with /bin/bash for interative.
CMD ["apache2","-DFOREGROUND"]

Das Herzstück ist natürlich die make_oracle.sh:

#! /bin/bash

echo "Make Oracle"

cd /opt
unzip instantclient-basic-linux.x64-12.1.0.2.0.zip
unzip instantclient-sdk-linux.x64-12.1.0.2.0.zip
cd /opt/instantclient_12_1
#instantclient_12_1/libclntsh.so.12.1
ln -s libclntsh.so.12.1 libclntsh.so
#ln -s libocci.so.10.1 libocci.so

echo /opt/instantclient_12_1 > /etc/ld.so.conf.d/oracle.conf
ldconfig

echo 'instantclient,/opt/instantclient_12_1' | pecl install oci8
echo "extension=/usr/lib/php/20151012/oci8.so" > /etc/php/7.0/mods-available/oci.ini
#echo "export NLS_LANG=GERMAN_GERMANY.WE8ISO8859P1" >> /etc/apache2/envvars 

Hier alle Dateien als ZIP.

Nun könnt ihr den Container erstellen und ausführen:

docker build -t php7oracle .
docker run -p 80:80 --name ora7 -d php7oracle

Ist der Container fertig erstellt, könnt ihr direkt per Console prüfen, ob die OCI8-Funktionen verfügbar sind:

docker exec -i -t ora7 php -m | grep 'oci8'

# liefert als Ergebnis 'oci8'

Das war’s. Jetzt könnt ihr direkt im Browser die info.php und test.php aufrufen. Dann solltet ihr folgende Ausgaben bekommen:

info.php

info.php

test.php

test.php

Hier das Script test.php als Listing. Bitte nicht vergessen in der Funktion oci_connect die IP-Adresse (vom Oracle-Server) zu ändern:

<?php

$conn = oci_connect('testuser', 'testpass', '192.168.176.178/orcl');
if (!$conn) {
    $e = oci_error();
    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}

$stid = oci_parse($conn, 'SELECT * FROM USER_ROLE_PRIVS WHERE username=\'TESTUSER\'');
oci_execute($stid);

echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
    foreach ($row as $key => $value) {
        echo "<tr>\n";
        echo "    <td>" . ($key !== null ? htmlentities($key, ENT_QUOTES) : "&nbsp;") . "</td>\n";
        echo "    <td>" . ($value !== null ? htmlentities($value, ENT_QUOTES) : "&nbsp;") . "</td>\n";
        echo "</tr>\n";
    }

}
echo "</table>\n";

Viel Spass :)