Docker: PHP7 mit OCI8
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
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) : " ") . "</td>\n";
echo " <td>" . ($value !== null ? htmlentities($value, ENT_QUOTES) : " ") . "</td>\n";
echo "</tr>\n";
}
}
echo "</table>\n";
Viel Spass :)