Sven Rautenberg: Bilder aus MySQL-DB im Browsercache

Beitrag lesen

Moin!

Gar nicht! Weil der Browser URLs mit einem Query "?ID=123" nicht immer als cachewürdig ansieht.

Was heist nicht immer? Heißt das, daß er es unter bestimmten Bedingungen tut?

Ich würde mal sagen: Wenn die HTTP-Header ausdrücklich ein Cachen erlauben, und bei erneuter Anforderung auch nur noch Status 304 anstatt 200 (und das komplette Bild) geliefert werden, dann hast du das Problem nicht mehr.

Ausführlicher:

Welche URL letztendlich zum Bild führt, ist unerheblich. Wenn der Browser erstmalig ein Bild anfordert, schickt er einen einfachen Request an den Server - und der muß liefern. Das Bild wird dann mit HTTP-Status 200 an den Browser geschickt. Dabei _kann_ der Server noch Caching-Informationen mitschicken, beispielsweise kann er sagen, daß das Bild noch drei Tage gültig ist (dann darf es sich aber in den drei Tagen auch nicht ändern - das wäre deine Aufgabe, denn der Browser fragt dann vermutlich drei Tage lang nicht erneut nach dem Bild).

Andererseits: Wenn der Browser das Bild schon im Cache hat, dann schickt er diese Information beim erneuten Abfragen zurück an den Server. Und der kann daraufhin entscheiden: Ist die auf dem Server liegende Bildversion neuer? Dann muß das Bild neu geschickt werden (mit Status-Code 200). Wenn das Bild auf dem Server aber älter oder gleichalt ist, dann wird ein kurzer HTTP-Header 304 (Not Modified) zurückgeschickt, und der Browser verwendet das Bild aus dem Cache.

Bei deiner jetzigen Programmierung wird der Browser vermutlich schlicht nachfragen (mit Datum), du aber diese Angabe ignorieren und das Bild schicken.

Das bedeutet, daß du dich etwas mehr mit dem HTTP-Protokoll beschäftigen mußt, mit den vom Server gesendeten Headern (die mit der Funktion header() gestaltet werden können) und mit dem, was der Client so sagt (was hoffentlich alles in $HTTP_SERVER_VARS oder $_SERVER drinsteht - phpinfo(INFO_VARIABLES); ist für einen Überblick da dein Freund).

- Sven Rautenberg