Sie sind hier : sebastian1012.bplaced.net/ homepage-neu / kreuz-und-quer / tutorials-info-neuigkeiten-php / die-ganze-wahrheit-ueber-client-caches.php

Die ganze Wahrheit über Client-Caches

Caches nennt man im Entwicklungsumfeld jene Systeme, die eine Zwischenspeicherung von Daten zwecks schnellerem Abruf anlegen. Viele Entwickler glauben allerdings, dass Caches etwas Böses sind, da sie dem Webmaster die Kontrolle über die Site entziehen und stattdessen ältere Inhalte ausliefern. Das ist auch wahr, allerdings nur, wenn man dem Cache nicht sagt, wer die Zügel in der Hand und was er zu tun hat. Dieser Beitrag soll zeigen, was wirklich hinter Caches auf der Client-Seite (Proxy- und Browser-Cache) steckt.

Erstmal möchte ich aufzeigen, wie ein Cache überhaupt arbeitet. Alle Caches folgen bestimmten Regeln:

Aktualität und Validierung sind also die Grundpfeiler eines jeden Caches. Eine aktuelle Version einer Datei kann sofort, ohne viel Aufwand geladen werden, während eine gültige Version dazu führt, dass nicht die gesamt Datei erneut geladen werden muss, wenn sich nichts geändert hat.

Wenn wir wissen, wie er arbeitet, müssen wir nur noch wissen, wie wir als Webmaster die Kontrolle über diese Arbeit erlangen.
Zuerst sind da die Meta-Tags zu erwähnen. Viele Entwickler packen dann einfach einen Mata-Tag in ihre Seite und denken ihre Seite sei nun „uncacheable“, aber das ist nicht der Fall. Meta-Tags sind in dieser Beziehung (wie mittlerweile in vielen anderen auch) uneffektiv. Der Grund dafür ist, dass nur einige Browser-Caches den HTML-Code wirklich lesen, ein Proxy-Cache schaut sich lediglich den Response-Header an, der Quelltext ist ihm egal.

Wir sehen also, dass wir mit den HTTP-Headern arbeiten müssen, um sowohl Proxy- als auch Browser-Caches effektiv zu erreichen. Diese Header werden normalerweise automatisch vom Webserver generiert, können aber bis zu einem bestimmten Grad auch von der Anwendung selbst bearbeitet werden.

Bevor ich auf die unterschiedlichen Header-Parameter zur Cache-Steuerung eingehe, möchte ich hier kurz noch erwähnen, wie mit PHP der Header bearbeitet wird: Vor allen Ausgaben kann man mit der Funktion header() die gewünschte Eigenschaft setzen. Als Beispiel:

header("Last-Modified: Fri, 25 May 2007 02:28:12 GMT ");

Oft sieht man in Anwendungen den Pragma HTTP-Header, um Caching zu verhindern. Pragma: no-cache wird in den HTTP-Header-Spezifikationen allerdings nicht als Antwort-Header vorgesehen. Lediglich als Request-Header ist er dort aufgeführt. Es kann sein, dass ihn manche Caches beachten, aber die meisten werden es nicht tun.

Um die Zeit einzustellen, wann die Seite nicht mehr aktuell ist und neu geladen werden muss, ist Expires die richtige Einstellung. Ich kann die Nutzung allerdings nicht unbedingt empfehlen, da ein exakter, absoluter Zeitpunkt, wann eine Datei abläuft oft schwierig festzulegen ist, als zusätzliche Angabe zu den weiter unten stehenden ist er aber allemal geeignet, zumal er bereits in HTTP 1.0 enthalten ist.

header("Last-Modified: " . gmdate("D, d M Y H:i:s",time() . " GMT");

Komfortabler sind aber relative Angaben wie die in Cache-Control:

Wenn man also zum Beispiel angeben möchte, dass eine Seite eine Stunde lang gecacht und dieser Zeitpunkt stets beachtet werden, schreibt man also:

header("Cache-Control: max-age=3600, must-revalidate");

Zusätzlich zu den oben gemachten Angaben gibt es seit HTTP 1.1 auch das ETag. Dieses wird automatisch vom Server generiert und ändert sich jedes Mal, wenn die lokale Version abgelaufen ist. Mithilfe dieses Tags kann man in der Anwendung prüfen, ob eine lokale Version der Datei bereit vorliegt, die aktuell ist. Wenn sie nämlich aktuell ist, ist die Variable $_SERVER[‚HTTP_IF_MODIFIED_SINCE‘] gesetzt. Eine geeignete Anwendung sieht dann so aus:

if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {   header("HTTP/1.0 304 Not Modified");   exit; }

Bei statischen Dateien werden diese Header automatisch genutzt, ohne dass man auf dem Server irgendetwas tun muss.

Im Internet findet man viele weitere Informationen, wie man seine Seiten cache-aware programmieren kann, wenn man das möchte (also dass nicht die gecachte Version genutzt wird). Ich hoffe aber, dass ich geholfen habe, die Angst vor Caches zu verlieren und sie als mächtiges Performance-Instrument anzusehen.