Ich danke schon seit einiger Zeit über schnelle Anwenungs-Caches für Internet-Anwendungen nach. Die bevorzugten Zutaten sind der Webserver Lighttpd, die Sprachen LUA und PHP sowie den Server Memcached, mit dem die Verteilung von flüchtigen Daten im Cluster ein Kinderspiel ist.
In meinem echt schlecht geschriebenen ThinkBlog-Artikel
Methods to reduce the load of your webserver by caching content: using lighttpd, MySQL UDF, LUA and speed everything up ging es im Prinzip darum:
Wenn eine PHP-Anwendung bei einem HTTP-Request aufgerufen wird, ist schon zu spät für Sinnvolle Caching-Maßnahmen. Es ist dann nur noch eine begrenzte Steigerung möglich.
Das Problem liegt einfach daran, dass Webserver dafür konzipiert wurden, statischen Inhalt auszuliefern. Mit der CGI-Schnittstelle und später mit Webserver eigenen APIs sowie der FastCGI-Schnittstelle ist es möglich, so zu tun, als würde der Webserver ebenfalls statische Seiten ausliefern. Nur dass diese eben vorher zusammengebaut werden müssen.
Wenn man mal davon ausgeht, was in einer Hight-Traffik Umgebung los ist, wird schnell klar, dass alleine die PHP-Interpreter-Aufrufe weh tun. Auch wenn man nicht davon sprechen kann, dass PHP perse langsam ist.
Um den Flaschenhals des Ladens und Parsings der PHP-Scripte ein Schnippchen zu schlagen gibt es Bytecode-Caches wie APC für PHP5. Gute Sache das. Dennoch muss bei jedem Request PHP ausgeführt werden. Und die Programmausführung muss immer länger dauern, als das direkte Ausliefern von Daten aus dem Hauptspeicher...
Mein Vorschlag im oben genannten Artikel hat unter Software-Architekten mit Recht einige Buh!-Schreie erzeugt: Nämlich Caching-Entscheidung in den Webserver zu verlagern. Die Information, die dieser "LUA-Teil" in der "Architektur" benötigt, wird direkt beim Schreiben der Daten erzeugt, damit er bei der Request-Abarbeitung im Webserver existiert.
Das scheussliche an meiner Idee war, dass ich für Datenbank-Operationen Stored Procedures verwedet habe, die an Ort und Stelle direkt in den Memcache schreiben. Und das ist keine gute Idee.
Im nächsten Teil werde ich die Idee für eine saubere Implementierung liefern, an der ich im Augenblick in Freislots arbeite. Das soll vorallem ermöglichen, PHP-Software zu schreiben, die den Cache verwendet, wenn man das
kann - ansonsten herkömmliche Strategien oder eben kein Caching verwendet.