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.
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-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.
# 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...
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 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.
Die Zeile
extension=oci8.so
hinzufügen.
Und apache neu starten
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.Erstellt am: 19.09.2022 unter den Kategorien PHP . | Kommentieren |