OXID eShop für PHP 7 patchen

Auf der diesjährigen OXID Unconference habe ich einen Vortrag darüber gehalten, was man tun muss, um eine aktuelle OXID CE 4.9.8 lauffähig für PHP 7 zu machen. Da das Interesse recht groß war und ich nachher mehrfach gefragt wurde, ob ich die Slides online stelle (was in Kürze erfolgen wird), möchte ich auch hier kurz noch einmal beschreiben, was zu tun ist.

Es gibt drei Bereiche, die aufgrund von Änderungen in PHP 7 auch im OXID eShop verändert werden müssen:

  1. MySQLi statt MySQL
  2. Änderungen im Error-Handling
  3. OXID Setup-Prozess

Die OXID-Installation

Das Patchen des Setup-Prozesses ist sehr aufwändig, weil hier sämtliche mysql-Befehle durch entsprechende mysqli-Befehle ersetzt werden müssen. Dies kann leider nicht durch ein simples „Suchen-Ersetzen“ erfolgen, weil bei den meisten mysqli-Befehlen leider die Reihenfolge der übergebenen Parameter verändert wurde. Ich empfehle daher, den Shop zunächst unter PHP 5.6 zu installieren und erst dann auf PHP 7 umzustellen. Das ist relativ einfach, weil PHP 7 problemlos neben PHP 5.6 installiert werden kann. Man muss für das Apache Module lediglich in „/etc/apache2/modules-enabled“ die Symlinks für die PHP 7 Dateien manuell setzen.

Erforderliche MySQLi Anpassungen

Im Blick auf den Wechsel von MySQL zu MySQLi sind 2 Anpassungen im OXID eShop nötig:

  • In der Datei config.inc.php muss der Parameter $this->dbType auf den Wert ‚mysqli‘ gesetzt werden. Standardmäßig steht er auf ‚mysql‘.
  • In der core-Klasse oxsysrequirements (core/oxsysrequirements.php) muss in der function checkMysqlConnect() die Zeile 740 die PHP Funktion ‚mysql_get_client_info()‘ durch die entsprechende mysqli-Funktion ersetzt werden:
    $sClientVersion = mysqli_get_client_info();

Das Error-Handling muss angepasst werden

Nun fehlen noch die Anpassungen im Rahmen des geänderten Error-Handlings. Hierfür müssen 2 Stellen in der core-Klasse oxexceptionhandler vorgenommen werden (core/exception/oxexceptionhandler.php):

public function handleUncaughtException(Exception $oEx)
public function handleUncaughtException($oEx)
protected function _dealWithNoOxException(Exception $oEx)
protected function _dealWithNoOxException($oEx)

Das war’s auch schon. Mit diesen Änderungen sollte der Shop nun PHP7-tauglich sein. Das Ganze funktioniert aber nur, wenn sich keine verschlüsselten Dateien im Shop befinden (z. B. Module). Denn leider sind solche Dateien immer für eine bestimmte PHP-Version verschlüsselt. Und für PHP 7 gibt es aktuell noch keinen Zend-Guard zum verschlüsseln – und auch keinen Zend-Guard-Loader zum entschlüsseln solcher Dateien.

Der Lohn ist Geschwindigkeit

Dass sich das Ganze lohnt, kann man an folgenden Messwerten sehen. Hier wurden mit dem Tideways-Profiler die 3 Seiten-Typen Startseite, Kategorieseite und Detailseite unter PHP 5.6 und unter PHP 7.0.7 untersucht. Die Verarbeitungszeiten und der Speicherverbrauch sprechen für sich:

OXID php7

Bei ScaleCommerce bieten wir bereits PHP 7 an. Wenn ihr eine OXID CE oder eine OXID EE (nach Unterzeichnung einer NDA) im offenen Quellcode unter PHP 7 laufen haben wollt – sprecht uns an!



0 Kommentare

Dein Kommentar

An Diskussion beteiligen?
Hinterlasse uns Deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.