Artikelformat

OpCode Cache – eine kurze Beschreibung

Nachdem ich im letzten Beitrag eine Installationsanleitung für APC geschrieben hatte, gibt es nun die Theorie dazu.Was macht PHP im Hintergrund, damit eine Quelltextdatei ausgeführt werden kann? Wenn man ersteinmal weiß, wie diese Grundlagen sind, so ist ein OpCode Cache keine Magie mehr. Es ist sogar sehr einleuchtend, wieso ein solcher Cache so funktioniert wie er dies tut.

Der PHP Parser schaut sich den Quelltext an und erzeugt eine abstrakte Repräsentation davon. Alle syntaktischen Elemente werden durch Tokens ersetzt, die gegen eine Grammatik geprüft werden. Beispielsweise wird if durch ein T_IF ersetzt. Immer wieder beliebt ist das T_PAAMAYIM_NEKUDOTAYIM Token. Wenn der Zugriff auf ein statisches Element einer Klasse nicht korrekt ist. Die Repräsentation in der Token-Schreibweise kann man sich mit der token_get_all Funktion ansehen, die in der Tokenizer-Erweiterung steckt. War der Parser zufrieden wird der Compiler aktiv und wandelt alles in den OpCode um. Hier gibt es die bytekit-Extension, um sich anzusehen, was PHP eigentlich ausführt. Das ist nämlich jetzt der letzte Schritt. Der OpCode wird von der Zend Engine ausgeführt. Das ist dann der Schritt, der ja eigentlich richtig spannend ist und auch abhängig von den Daten andere Ergebnisse liefert.

Nun schaut man siche den OpCode-Cache an. Dieser hängt sich vor den Parser und checkt, ob er den OpCode einer Datei bereits kennt. Ist dies der Fall wird der gesamte Parser übersprungen und der OpCode aus dem Cache wird der Zend Engine zur Ausführung übergeben. Damit spart man sich die ganze Zeit, die der PHP Parser nutzt um den Quelltext zu analysieren. Sollte der OpCode nicht vorhanden sein, so wird der normale Weg wie immer gegangen und der OpCode vom Parser erzeugt. Dieser OpCode wird aber nicht nur der Zend Engine übergeben, sondern auch im Cache hinterlegt für eine weiter Ausführung. Wenn man nun über den Tellerrand schaut, kann man grob sagen, dass PHP hier wie Java arbeitet. Dort wird ein Bytecode erzeugt, der in den Class-Dateien abgelegt wird. Und diese Werden dann ausgeführt. Also hat Java Compiler und Ausführungsebene in 2 Programme aufgeteilt, PHP jedoch nicht. Mit dem OpCode-Cache kann man dies aber zu einem gewissen Grad simulieren.

Jetzt wird auch die Regel klar, dass „viel Code und wenig Berechnung“ durch einen Code sehr viel schneller wird, als ein PHP-Skript mit „wenig Code und viel Berechnung“. Schließlich entfernen wir nur den Parser aus der Verarbeitungskette. Und Wenn deiser viel Code bekommt, muss er viel tun. Bei wenig Code ist die Zeit im Parser entsprechend geringer.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.