PHP-Tipps: Caching mit E-Tags
Wer häufig dynamische Seiten mit PHP erstellt, kennt das Problem: Meistens muss man das Zeit-Caching des Browsers mit meta-Tags oder speziellen header-Kommandos abschalten, damit stets der aktuelle Inhalt ausgeliefert wird.
Wenn man jedoch genau feststellen kann, wann sich eine Seite ändert, so gibt es doch eine ganz einfache Methode, dennoch Seitencaching zu ermöglichen – Stichwort E-Tags.
Dabei wird für jede Seite ein eindeutiger ETag vergeben, der sich ändert, sobald die Seite nicht mehr dieselbe ist. Der ETag selbst kann theoretisch eine beliebige Zeichenkette sein. Idealerweise besteht dieser ETag nun z.B. aus einer Prüfsumme des Seiteninhalts – so führt auch die kleinste Änderung zu einer ETag-Änderung – der Browser läd die Seite erneut.
Einsetzen lässt sich dies mit PHP relativ einfach.
Zunächst wird ein ETag für die Seite gesetzt, nehmen wir an, dieser ist in der Variable $etag gespeichert.
// $etag enthält den ETag für diese Seite, z.B. erzeugt durch sha1($seitenInhalt) header('ETag: "' . $etag . '"');
Beim nächsten Laden der Seite schickt nun der Browser einen speziellen HTTP-Header mit: IF_NONE_MATCH. Dieser wird nun mit dem ETag verglichen – und bei übereinstimmung kein Inhalt ausgeliefert:
// $etag enthält den ETag für diese Seite, z.B. erzeugt durch sha1($seitenInhalt) if (!empty ($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag) { // HTTP-Statuscode 304 senden, keine Ausgabe header ("HTTP", true, 304); exit; } // Seite nicht gecacht, sende ETag sowie Ausgabe header('ETag: ' . $etag);
Und das wars auch schon. Mehr zum Thema ETags und HTTP-Statuscodes gibts bei Wikipedia.