Facebook
Twitter
Google+
Kommentare
10

Byte-Code-Cache

Die Ideenschmiede schlägt heute das erste mal seit langer Zeit wieder zu, aber ich hatte ja angekündigt, dass ich sie jetzt ein bisschen weniger stiefmütterlich behandeln will. Heute also das erste Thema, dass von 28 Leuten gewählt wurde: „Was sind eigentlich Byte-Code-Caches?“

Holen wir mal ein wenig aus. PHP kennt man als interpretierte Sprache, was nicht so ganz richtig ist. Wie bei Java wird plattformunabhängiger Byte-Code erstellt, welcher später von der Zend-Engine ausgeführt wird. Dies geschieht im Normalfall bei jedem Ausführen eines Skriptes. Um den Byte-Code zu erstellen muss PHP erstmal den Code lexen (Zerlegen in Token) und danach parsen. Dies kann je nach Anzahl der inkludieren PHP-Dateien einen großen Anteil der Laufzeit des Skriptes bedeuten. Und was das schlimmste ist: eigentlich ändert sich der Byte-Code so gut wie nie.

Beispiel

Auszuführender PHP-Code

$output = „Hello World!“;
echo $output;
return;

Resultierender Byte-Code

ASSIGN !0 ‚Hello+World%21‘
ECHO !0
RETURN 1
ZEND_HANDLE_EXCEPTION

Zum Glück ist das System rund um die Zend-Engine so konstruiert, dann man Caches einhängen kann, die den Byte-Code vorhalten und nur bei Änderungen lexen und parsen, was einen enormen Geschwindigkeitszuwachs bedeuten kann. In meinem Fall sind es sogar bis zu 300%, was wohl wirklich der Rede wert ist.

Wer auf Nummer sicher gehen will, der installiert sich APC als wohl gängigstes Cache-System. Es gibt aber jede Menge weiterer Vertreter, die fast alle das gleiche machen. Schönes Feature von APC ist noch, dass er als normaler In-Memory-Cache verwendet werden kann und erweitert somit die Grundfunktionalität von PHP um ein paar Befehle.

So das war jetzt erstmal ein grober Überblick. Ich werde wohl noch einen Artikel direkt zu APC schreiben, damit da auch alle Feinheiten (die ich kenne) unter kommen.

Über den Autor

Nils Langner

Nils Langner ist der Gründer von "the web hates me" und auch der Hauptautor. Im wahren Leben leitet er das Qualitätsmanagementteam im Gruner+Jahr-Digitalbereich und ist somit für Seiten wie stern.de, eltern.de und gala.de aus Qualitätssicht verantwortlich. Nils schreibt seit den Anfängen von phphatesme, welches er ebenfalls gegründet hat, nicht nur für diverse Blogs, sondern auch für Fachmagazine, wie das PHP Magazin, die t3n, die c't oder die iX. Nebenbei ist er noch ein gern gesehener Sprecher auf Konferenzen. Herr Langner schreibt die Texte über sich gerne in der dritten Form.
Kommentare

10 Comments

  1. Läuft der Byte-Code-Cache lediglich auf Zend Server Maschinen oder ist die Zend Engine der generelle PHP-Parser? Denn 300% sind nun wirklich nicht verachten. 🙂

    Reply
  2. Wenn du einen Artikel zum Thema APC schreiben möchtest, wäre vielleicht mal ein Abschnitt über die Optimierung der Einstellung und deren Auswirkungen toll. Wieviel Ram sollte man für den APC zur Verfügung stellen? Gibt es ab einer gewissen Grenze noch einen Geschwindigkeitszuwachs oder reichen bspw 128MB vollkommen aus?

    Reply
  3. @Tobi: Zend Engine und Zend Server sind zwei komplett verschiedene Dinge. Die Zend Engine ist PHPs interne Laufzeitumgebung, während der Zend Server ein Bundle aus Apache, PHP, Datenbank und co – von der Firma Zend bereitgestellt – ist.

    Reply
  4. @Norbert: viel verstellen braucht man da nicht. Dir Größe sollte so groß sein das alle Projektdaten drin abgelegt werden können. Ansonsten ist stat = 0 zu setzen, damit die Festplatte entlastet wird. Alle anderen Settings geben keine signifikanten Geschwindigkeitsvorteile.

    Reply
  5. @Jens: Soviel ich weiß, bekommst du den Byte-Code gar nicht in PHP produziert. Der erste Schritt dorthin, also das Lexen, funktioniert über die token_get_all-Funktion. Mein Beispiel hatte ich aus einer Doku zum Thema APC.

    Reply
  6. Wir hatten heute passender Weise in der Firma nen Techtalk über PHP-Interna, da sind wir auch an Opcode-Caches (so heißts richtig) geraten. Bei uns allerdings dann eaccelerator statt APC.

    An die Opcodes kommt man mit dem Vulcan Logic Dumper http://derickrethans.nl/projects.html#vld
    http://pecl.php.net/package/vld
    Einfach die Extension installieren, nicht aktivieren, und dann via CLI nen PHP-Script aufrufen und dort mit der Option „-dvld.active=1“ den Dumper zuschalten.

    Was noch weit aus interessanter ist: Die Opcode-Caches, zumind eaccelerator, optimieren die Opcodes auch. PHP bastelt die nach dem Lexen nämlich sehr stumpf, dumm und semioptimal zusammen. z.B. werden dann Rechenoperationen mit Konstanten direkt durch die Ergebnisse ersetzt oder Ketten von Jumps durch einzelne Jumps direkt auf das Endziel ersetzt.

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen