Kompatibilität von OXID Shop (CE) und PHP 7.0


Seit einiger Zeit stellen wir unsere Hosting-Strukturen auf das neue PHP7 um. Bisher gibt es zwar erst einen Release-Candidate. Der Fortschritt von PHP 7.0 ist jedoch beachtlich und die neue PHp Version zeigt schon länger enorme Stabilität. Früh bzw. spät genug, um ein paar richtig hochlastige OXID Shops mit unseren schnellen responsiven OXID Themes weiter zu beschleunigen.

OXID ist natürlich noch nicht an PHP 7 angepasst. Die notwendigen Überarbeitungen an OXID Dateien sind nur geringfügig und können problemlos selbst durchgeführt werden. Für unsere Hosting- und Managed OXID-Kunden stellen wir die Änderung in Kürze automatisch bereit.

OXID für PHP 7 Errors & Exceptions anpassen

OXID nutzt die altbekannten Exceptions aus PHP 5.3-Zeiten, und das leider auch ohne vernünftige Namespaces. Das neue PHP 7 Fehler-Modell sieht einen neuen PHP-internen Fehlertyp Throwable als Interface vor, der Exceptions und die bisherigen Fatal Errors vereint. Insofern könnte statt einer bisherigen Exception von PHP durchaus ein Error geworfen werden. Genau das passiert auch in eine ungepatchten OXID Shop recht schnell:

Fatal error: Uncaught TypeError: Argument 1 passed to oxExceptionHandler::handleUncaughtException() must be an instance of Exception, instance of Error given in /.../core/exception/oxexceptionhandler.php:90 Stack trace: #0 [internal function]: oxExceptionHandler->handleUncaughtException(Object(Error)) #1 {main} thrown in /.../core/exception/oxexceptionhandler.php on line 90

Glücklicherweise lässt sich dieser Fehler einfach korrigieren. Die zentrale Fehler-Station im OXID Onlineshop sitzt in der Datei /core/exception/oxexceptionhandler.php, wie das PHP Statement deutlich zeigt. Hier muss in Zeile 90 (als Basis dient ein aktueller OXID CE 4.9.6 Onlineshop) lediglich das Type-Hinting entfernt werden.

public function handleUncaughtException(Exception $oEx)

... wird geändert zu ...

public function handleUncaughtException($oEx)

Die Datei enthält noch mehrer Exception-Handler. Vorsorglich könnte auch bei diesen das PHP Type Hinting mit Exception entfernt werden.

Datenbank auf mysqli umstellen

OXID nutzt das antike adodb Framework um unabhängig von der zugrundeliegenden Datenbank-Technologie zu sein. Theoretisch kann so ein Wechsel von MySQL zu PostgreSQL oder MS SQL Server einfach realisiert werden - leider nur theoretisch, weil die Datenbanken zum Teil sehr angepasste Datentypen haben und sich auch im Umfang der unterstützten SQL- Sprachsyntax unterscheiden.

Seit Urzeiten von PHP wir MySQL unterstützt. Die erste Schnittstelle trug noch den Namen mysql, später wurde daraus mysqli, mittlerweile setzen viele seriöse Projekte auf PDO oder andere Abstraktionsschichten, die direkt von PHP unterstützt werden. Im Zuge einiger Entrümpelungen innerhalb des PHP 7 Sprach- und Bibliothekkerns wurde mysql nun endgültig als veraltet entfernt. Der OXID Online Shop greift also beim Versuch mit der Datenbank zu sprechen ins Leere:

Error: Call to undefined function mysql_query()

Glücklicherweise ist mysqli noch enthalten geblieben und wird auch von adodb unterstützt. Somit ist die Lösung, in der zentralen config.inc.php Datei des Shops einfach den Datenbanktyp bzw. Datenbanktreiber auf mysqli umzustellen. Hier ein Beispielauszug, wie der neue Eintrag lauten müsste:

    $this->dbType = 'mysqli';

OXID Fehler im Backend beheben

Eine weitere Stelle, an der sich die unvollständige Datenbank-Abstraktion in OXID bemerkbar macht ist das OXID Backend oder der OXID Administrationsbereich in dem Sie Ihren Onlineshop verwalten. Auf der Home-Seite im Backend wird ebenfalls ein Datenbankfehler ausgeworfen. Das Shopsystem durchläuft die Datei /core/oxsysrequirements.php. In Zeile 741 (OXID Community Edtition 4.9.6) wird die Funktion mysql_get_client_info() für eine Abfrage genutzt. PHP 7 hat nach längerer Markierung als deprecated diese Funktionen nun endgültig über Bord geworfen, so dass hier ein fataler PHP Fehler eintritt. Anstelle der Funktion mysql_get_client_info() kann der OXID Shop die etwas modernere Funktion mysqli_get_client_info()genutzt werden, die in PHP 7.0 weiterhin enthalten ist. Damit müsste die gesamte Zeile im OXID Quelltext so aussehen:

sClientVersion = mysqli_get_client_info();

Nach diesen Änderungen läuft der OXID Shop erstmal unauffällig mit PHP 7.

* Unsere Services und Dienstleistungen richten sich ausschließlich an gewerbliche Abnehmer. Daher gelten alle Preise zzgl. der Umsatzsteuer.

© copyright 2017 by zoks.net - 1965