Ein simpler Cache mit PHP
Der Sinn von Caches
Caches kommen immer dann zur Anwendung, wenn ein hoher Aufwand für das Neu-Generieren von Inhalten vermieden werden soll. Einen Cache kann man also als Zwischenspeicher bzw. Puffer für Daten, die bereits einmal vorlagen verstehen, der beim nächsten Aufruf verwendet wird, um die Daten schneller zur Verfügung zu stellen.
Beispiele finden sich in diversen Anwendungen (v.a. in Browsern wäre ein Fehlen undenkbar), bei Festplatten, Prozessoren und auch bei (nicht statischen) Webseiten. Zur letzteren Art gehört auch mein Blog, der sich die Inhalte bisher bei jedem Seitenaufruf aus meiner MySQL-Datenbank geholt hat. Das ist sehr rechenzeitlastig, da immer beim Aufruf meines Blogs mehrere SQL-Abfragen ausgeführt werden müssen. Außerdem würde sich ein Cache besonders für viel aufgerufene Seiten rentieren.
Also habe ich mich hingesetzt und eine Art Puffer in meiner Blogsoftware implementiert.
Die Funktionsweise
Grob zusammengefasst tut mein Cache folgendes: Beim Aufruf einer Seite mit einem bestimmten GET-Parameter wird eine Funktion aufgerufen, die die URL der aufgerufenen Seite ausliest. Die Funktion holt sich die generierte Ausgabe der Seite, also das Ergebnis der SQL-Abfragen, und speichert diese in einer nach der Seite benannten Textdatei ab. Wenn anschließend ein Seitenaufruf stattfindet, wird von nun an nicht mehr die Datenbank bemüht, sondern der komplette Inhalt der Textdatei ausgegeben. Das ist wesentlich performanter und verkürzt die Ladezeiten.
Die Grundlage, also das Speichern der generierten Inhalte einer Seite, bieten die Funktionen der PHP-Ausgabepufferung:
function cache_schreiben()
{
$datei = fopen("cache/".preg_replace("/([&\?]cache=)([^&^\"]+)/i","",$_SERVER[REQUEST_URI]).".cache","w+");
$file=ob_get_contents();
fwrite($datei, $file);
fclose($datei);
}
Das ist die Funktion, die den PHP-Buffer ausliest und den Inhalt in eine Datei schreibt. Mit dem regulären Ausdruck wird der GET-Parameter „cache“ ausgefiltert, der lediglich dazu zuständig ist die Erneuerung des Caches zu bewirken. Möglicherweise muss vorher noch die Ausgabebufferung aktiviert werden, bei mir ist das nicht der Fall.
$datei="cache/".preg_replace("/([&\?]feed=)([^&^\"]+)/i","",preg_replace("/([&\?]cache=)([^&^\"]+)/i","",$_SERVER[REQUEST_URI])).".cache";
if(!isset($_GET['cache']) AND file_exists($datei))
{
$datei=fopen($datei, "r");
while (!feof($datei)) {
$buffer = fgets($datei, 4096);
echo $buffer;
}
die;
}
Diese Abfrage sollte am Anfang der Seite eingebaut werden. Die Textdatei wird, wenn sie existiert und der GET-Parameter nicht gesetzt ist, ausgelesen und der Inhalt ausgegeben. Jetzt muss nur noch festgelegt werden, was passiert wenn die Datei nicht vorhanden ist oder der Parameter an die URL angehängt worden ist:
if (!file_exists($datei) OR $_GET['cache']==1)
{
cache_schreiben();
}
Fertig!