Von einem Ubuntu-Webserver aus muss ich in PHP-Skripten auf eine Oracle SQL Datenbank zugreifen können (die auf einem anderen Server läuft).

Obwohl es doch einige Hürden zu überwinden gab, war ich positiv überrascht, dass ich schnell ans Ziel kam.

alien installieren

Da Ubuntu nichts mit den .rpm-Installationspaketen anfangen kann, die Oracle zur Verfügung stellt, musste ich erst alien installieren.

Verwendet man ein anderes Linux, welches etwas mit rpm anfangen kann, kann man sich diesen Schritt sparen.

sudo apt install alien

Oracle Client installieren

Zuerst die rpm-Installationspakete herunterladen.

Dann mit Hilfe von alien installieren. Oder mit rpmoder yum, sollte das eingesetzte Linux-System dies können.

wget https://download.oracle.com/otn_software/linux/instantclient/217000/oracle-instantclient-basic-21.7.0.0.0-1.el8.x86_64.rpm
wget https://download.oracle.com/otn_software/linux/instantclient/217000/oracle-instantclient-sqlplus-21.7.0.0.0-1.el8.x86_64.rpm
wget https://download.oracle.com/otn_software/linux/instantclient/217000/oracle-instantclient-devel-21.7.0.0.0-1.el8.x86_64.rpm
sudo alien -i oracle-instantclient-basic-21.7.0.0.0-1.el8.x86_64.rpm
sudo alien -i oracle-instantclient-sqlplus-21.7.0.0.0-1.el8.x86_64.rpm
sudo alien -i oracle-instantclient-devel-21.7.0.0.0-1.el8.x86_64.rpm

SQL command line client

Wer die Datenbankverbindung mal von der Kommandozeile aus testen möchte, kann dies mit sqlplus:

sqlplus benutzer/passwort@server/datenbank

Zum Beispiel

sqlplus apfelz/meinG3h3imesPasswd@192.168.178.99/testdb

Auf der PHP-Seite...

Noch ein Sonderproblem bei mir: Da PHP 7.3 im Einsatz ist und auf dem Server zusätzlich PHP 8.1 installiert ist, wurde die benötigte OCI-Erweiterung immer für PHP8.1 kompilliert (was scheiterte, da ich die OCI-Version für PHP 7.3 heruntergeladen hatte).

Hier habe ich einen separaten Artikel darüber geschrieben, wie man PHP-Module für die gewünschte PHP-Version installieren kann.
Kurz zusammengefasst habe ich vor Installation des OCI-Moduls erst folgende drei Befehle ausgeführt. Die Meisten werden diesen Schritt aber überspringen können, da sie entweder nicht mehere PHP-Versionen installiert haben oder die neuste PHP-Version auch auf dem Webserver verwenden.

# Webserver läuft mit PHP 7.3, also will ich folgende Installation
# auf in der PHP 7.3-Umgebung durchführen...
sudo update-alternatives --set phpize /usr/bin/phpize7.3
sudo update-alternatives --set php /usr/bin/php7.3
sudo update-alternatives --set php-config /usr/bin/php-config7.3

Nun die passende OCI-Version herunterladen und installieren.
Auf pecl.php sind die verschiedenen Versionen samt einer Info zu finden, mit welcher PHP-Version sie jeweils verträglich sind.

Entweder manuell installieren...

wget https://pecl.php.net/get/oci8-2.2.0.tgz # <-- für PHP 7.x
tar -zxf oci8-2.2.0.tgz
cd oci8-2.2.0/
phpize
./configure -with-oci8=shared,instantclient,/usr/lib/oracle/21/client64/lib # <-- Prüfen, ob dieser Pfad auch tatsächlich in der Art existiert
sudo make install

...oder mit dem pecl-Befehl... (von mir nicht getestet)

sudo apt install php7.3-dev  # <-- für pecl-Kommando, falls noch nicht installiert
sudo pecl install oci8-2.2.0 # <-- für PHP 7.x

Nun noch die Erweiterung in der php.ini eintragen.

Wo finde ich die php.ini?
Falls man sich nicht sicher ist, wo sich die php.ini befindet oder welche von vielen die Richtige ist, ein php-Skript mit dem Inhalt <?php phpinfo(); ?> auf den Webserver legen und im Browser aufrufen.
Auf der Info-Seite sollte der Pfad zur verwendeten php.ini-Datei zu finden sein.

sudo pico /etc/php/7.3/apache2/php.ini

Die Zeile
extension=oci8.so
hinzufügen.

Und apache neu starten

sudo systemctl restart apache2

Ein PHP-Skript mit dem Inhalt <?php phpinfo(); ?> sollte nun eine installierte OCI-Erweiterung angeben.

Umlaute

Bei meinen Abfragen kamen die Umlaute leider nicht mit. Hier muss man noch NLS_LANG korrekt konfigurieren.
War in meinem Fall standardmäßig GERMAN_GERMANY.WE8MSWIN1252 musste aber GERMAN_GERMANY.UTF8 sein.

Testen kann man dies am besten, indem man auf der Kommandozeile ein paar Charsets durchtestet export NLS_LANG=GERMAN_GERMANY.UTF8 und sich dann jeweils per sqlplus mit der Datenbank verbindet und sich einen Datensatz holt, der Umlaute enthält.

Ist das korrekte Charset gefunden, muss man dies in /etc/apache2/envvars eintragen. Ich habe hier am Ende der Datei export NLS_LANG=GERMAN_GERMANY.UTF8 eingetragen und dann Apache neu gestartet. Danach wurden die Umlaute korrekt behandelt.

Je nach Linux-System muss statt export NLS_LANG=GERMAN_GERMANY.UTF8 folgendes verwendet werden: setenv NLS_LANG GERMAN_GERMANY.UTF8
Und je nach Linux-System ist die zu ändernde Config-Datei von Apache nicht /etc/apache2/envvars kann anders heißen und/oder wo anders liegen.

PHP Referenz

Was man mit der neugewonnenen Schnittstelle anfangen kann, erklärt php.net.