Antworten auf Ihre häufigsten Fragen

Was ist der PHP ByteCode Cache?

Der Bytecode Cache oder auch PHP OPcache ist eine ab PHP 5.5 in PHP integrierte Erweiterung, die einen enormen Geschwindigkeitsvorteil bringen kann, wenn man sie richtig einsetzt. Es werden die Fragen behandelt, wofür der Cache gedacht ist, wie er arbeitet und wie er auf unserer WebServer-Plattform verwendet werden kann.

Was/wofür ist der Bytecode Cache?

Der Fluch der Interpretersprachen:

Interpretersprachen (PHP, Perl, Python, Ruby und andere, übrlicherweise als "Skriptsprachen" bekannte Programmiersprachen) sind Sprachen, bei denen der Quellcode eines Programmes an sich zur Ausführung kommt. Dies unterscheidet sie von Compilersprachen, bei denen das Programm, das zur Ausführung kommt, schon in eine maschinenlesbare Form übersetzt wurde. Im Endeffekt arbeiten beide Sprachen mit maschinenlesbaren Befehlen, bei Interpretersprachen jedoch muss der Quellcode bei jeder Ausführung aufs neue in Maschinensprache übersetzt werden - Compilersprachen hingegen tun dies nur einmal und bringen den immer selben Maschinencode direkt zur Ausführung.

PHP-Webseiten sind so betrachtet also nichts anderes als Programme, deren Quellcode vorliegt. Der Prozess der Übersetzung von PHP Code dauert in vielen Fällen, insbesondere bei dynamischen Webseiten mit sehr viel Code, wenig Aktivität und wenig Output meist länger als die eigentliche Programmlaufzeit. Noch dazu werden Webseiten mehrmals gleichzeitig und oft hintereinander ausgeführt - jedes mal wird der Code der Webseite neu eingelesen, interpretiert, übersetzt und ausgeführt. Und das, wo sich der Quellcode der Seite zwischen den Ausführungen selten ändert. Sogenannte Caching Proxies können zwar das Ergebnis eines PHP-Skriptes, also die fertig gerenderte Seite, zwischenspeichern, aber wie sinnvoll ist das mit dynamischen Webseiten?

Der Bytecode:

PHP liest beim Ausführen eines PHP-Skriptes den Quellcode ein, löst Includes und Abhängigkeiten zu anderen Skripten auf und hat am Ende dieses Vorgangs eine große Menge PHP-Code. Dieser wird von einem Parser auf Richtigkeit geprüft und von einem Bytecode Compiler dann in eine Zwischenform übersetzt, die die Ausführung des Codes ermöglicht. Diese Zwischenform wird auch Bytecode genannt. Die Übersetzung des Klartext-Quellcodes in den Bytecode nimmt oftmals die längste Zeit in der Ausführungskette in Anspruch, da in dieser Phase das Format des Codes für die Verarbeitung in einer Maschine nicht optimal, sondern auf die Bearbeitung durch Menschen optimiert ist.

Aus diesem Grund müssen viele Überprüfungen und Analysen auf dem Code durchgeführt werden, bevor er in eine maschinenlesbare Form gebracht werden kann. Diese Zeit wird jedes mal beansprucht, wenn ein PHP-Skript ausgeführt wird, da der Bytecode nicht gespeichert wird. Skriptsprachen wie Python arbeiten um dieses Problem herum, indem sie zumindest Module und Komponenten in ihrer Bytecode-form cachen - PHP allerdings besitzt von Hause aus keine solche Funktion und muss daher mehr arbeiten.

Wäre es nicht schön, sich diese Zeit sparen zu können? Ja... natürlich. Wichtig hierbei ist, dass es sich bei dem Bytecode um eine übersetze Form des PHP-Skriptes handelt und nicht um den ausgegebenen HTML-Code. Der Bytecode kann also weiterhin ohne Verlust der Dynamik einer Webseite ausgeführt werden.

Der Cache:

Für PHP gibt es mehrere Projekte, die es sich zur Aufgabe gemacht haben, einen Bytecode-Cache zu entwickeln, welcher die Performance von Skripten durch Zwischenspeicherung des Bytecodes gerade bei komplexen Webseiten drastisch verbessern soll. Zu diesen Projekten zählen unter Anderem APC und XCache. Diese Projekte wurden mit dem Erscheinen von PHP 5.5 jedoch durch den OPcache abgelöst, welcher direkt in PHP integriert ist.

Der Cache ist eine Struktur aus Festplattenspeicher und Arbeitsspeicher, in der Bytecode von PHP-Seiten je nach Größe, Häufigkeit der Verwendung, Dynamik und Häufigkeit der Änderungen des Quellcodes einsortiert und abgefragt wird. Wichtig zu beachten ist wieder, dass nicht etwa der erzeugte HTML-Output einer Seite gecached wird, sondern der Bytecode, der weiterhin ausgeführt werden kann. Man bemerkt also beim Betrachten einer Webseite im besten Fall lediglich einen pfeilschnellen Seitenaufbau und nicht etwa alten gecachten Content.

Neben dem Bytecode speichert der Cache auch Verfallsdaten und das Datum der letzten Änderung eines PHP-Skriptes. Ändert sich also ein PHP-Skript, so wird es neu interpretiert und der Cache aktualisiert. Veraltete Webseiten gibt es so also nicht. Zwar dauert der Seitenaufbau ein einziges Mal wieder etwas länger, aber oft ändert sich der PHP-Code ja in den meisten Fällen nicht.

Probleme:

Bytecode Caches setzen an einer sehr grundlegenden Stelle im Verarbeitungsprozess eines PHP-Skriptes an. Daher kann es beim Einsatz von Bytecode Caches zu Problemen mit Webseiten kommen, die auf den ersten Blick nicht mit diesen Caches in Verbindung zu stehen scheinen. Gelegentliche weiße Seiten gehören hier zu den häufigsten Symptomen.

Insgesamt gilt, dass Bytecode Caches zwar toll klingen, aber kein Allheilmittel für Performance-Probleme sind. Erst recht ist ihre Optimierung und Einstellung ein langfristiger Prozess, der sich nicht verallgemeinern lässt und sehr von Ihrer Applikation abhängt (Größe des Caches, Lebensdauer, Prüf-Intervalle, eventuelle Optimierungsstufen und mehr). Falls Sie nicht über einen fortgeschrittenen Sachverstand und Kenntnis über Ihre Applikation und deren Fähigkeiten, Eigenheiten und Abhängigkeiten verfügen, werden Sie kaum bis nicht von einem Bytecode Cache profitieren.

Welche Bytecode Caches gibt es?

APC / Alternative PHP Cache:

Webseite zu APCu

Seit PHP 5.5 ist der Bytecode-Cache Teil von APC in den OPcache (siehe nächster Block) eingeflossen und somit direkt in PHP enthalten, die bisher genutzte APC Extension wird daher nicht mehr benötigt. Doch wenn Sie APC nicht nur wegen seiner Bytecode-Cache-Fähigkeit genutzt haben sondern auch aufgrund der User-Cache-Funktionen (Key-Value Memory Cache), dann können Sie jetzt die abgespeckte Erweiterung APCu nutzen, in der alle Bytecode-Funktionen entfernt wurden.

OPcache:

php.net OPcache Site

Generell können Sie alle OPcache-Einstellungen verändern, die auf der folgenden Seite mit "PHP_INI_ALL" markiert sind: Informationen zur Konfiguration auf php.net

Weitere Bytecode Caches existieren, kommen auf unserer Plattform allerdings nicht mehr zur Anwendung. Ein Beispiel ist der bereits oben erwähnte XCache oder der nicht mehr weiter entwickelte Turck MMCache for PHP, auf dem der ebenfalls nicht mehr weiter entwickelte eAccelerator aufbaut.

Wie kann ich einen Cache aktivieren?

Der OPcache ist standardmäßig aktiviert. APCu lässt sich über das KIS aktivieren. Navigieren Sie dazu zum folgenden Menüpunkt:

Produktverwaltung - WebServer - Konfigurieren - Skripte & Datenbanken - Caching-Einstellungen

Hier muss lediglich unter der Überschrift "APC User Cache (APCu)" die Einstellung auf On geändert und gespeichert werden. Nach ca 15 Minuten steht Ihnen APCu dann zur Verfügung.

Wie und was ist wo verfügbar?

Cache Modul WebHosting
WebPack
WebServer
WebServer Dedicated
Virtual Server Managed
Dedicated Server Managed
WebPack Pro
funktioniert mit
Zend Optimizer?
Verfügbar in PHP-Version Anmerkungen
OPcache nein ja nein PHP 8.0
PHP 8.1
Kann lediglich Bytecode-Caching durchführen und ist auf den entsprechenden Produkten standardmäßig aktiv.
APCu (ObjectCache) nein ja nein

PHP 8.0
PHP 8.1

Kann lediglich das Object-Caching übernehmen.

 

Anmerkungen zu Zend / ionCube:

Der Zend Optimizer und der ionCube Loader sind Decoder für die Ausführung von kodiertem und geschütztem PHP-Code. Diese Decoder arbeiten relativ schlecht mit Bytecode Caches zusammen. Es kann daher bei entsprechend geschützten PHP Dateien zu Problemen bei der Ausführung kommen, sodass unter Umständen der OPcache abgeschaltet werden muss.


otto.friedrich@hosteurope.de xanthippe.ypsilante@hosteurope.de hercules.ikarus@hosteurope.de