Cybaer: Datei cachen - ist dieses Verfahren technisch machbar?

Beitrag lesen

Hi,

Welchem Zweck dient das? "Expires" sollte eigentlich garnicht vorkommen, da die Dateien (egal, ob sie physikalisch existieren oder nicht) dauerhaft gueltig sein werden.

Umso wichtiger!

Googel mal nach Expires Cache-Control ...

Und bei "Last-Modified" gilt eigentlich dasselbe: die Dateien koennen nicht verändert werden. Werden sie verändert, dann ändert sich auch der Dateiname (vgl. meine Antwort auf Sven's Beitrag).

Umso wichtiger!

Brauche ich diese Header-Angaben also trotzdem?

Also wenn Du Traffic sparen (und dem User möglichst wenig Traffic zumuten) möchtest: Ja.

und ggf. unnötige Requests mit einem "304"Header zu beantworten, ohne die Bilddaten unnötig durch die Leitung zu pusten ...
Macht der Apache sowas automatisch? Oder muss ich ihn dazu anweisen?

Der Apache macht das automatisch - bei statischen Dateien. Du generierst den Output on-the-fly - also mußt Du dich auch selbst drum kümmern.

Wenn Du dem Client sagst, er soll sich bei einem wiederholten Aufruf aus seinem Cache bedienen, dann macht er das ggf. auch. Wenn Du ein Last-Modified- oder ETag-Header schickst, dann fragt sendet der Client beim erneuten Request diese Daten mit, Du kannst dann entscheiden, ob sich die Daten mittlerweile geändert haben, und statt 200 & Daten einen 304 ohne Daten schicken.

Wenn sich deine Daten aber ohnehin nie nicht ändern, dann kannst Du dir aber vielleicht die Überprüfung auch ersparen (unsauber, aber schnell implementiert ;-)): schick doch einfach ein willkürliches ETag mit, und wenn ein Request mit einer ETag-Nachfrage kommt, dann hat der Client die Daten schon ;->:

  
<?php  
if(!empty($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH']=='never-changed') {  
 header('Status: 304 Not Modified');  
 header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified');  
 header('Connection: close');  
 die();  
} else {  
 header('ETag: never-changed');  
 // Hier noch Expires- und Cache-Control-Header nach Wunsch  
 send_data();  
}  
?>  

wobei send_data() die Funktion ist, die dann die Bilddaten ausliefert ...

Also, um mal abzuschweifen: http://www.umdiewelt.de hält zur Zeit ca. 45.000 Bilder parat, die mir monatlich 100GB Traffic bescheren. Wie kann ich feststellen, ob da bereits 304 genutzt wird?

Im Log steht jeweils der Statuscode des Requests. Z.B. 200 (erfolgreich) inkl. der übertragenen Bytes, oder eben 304, dann üblicherweise ohne Bytes (der Client hatte die Daten ja schon).

Gruß, Cybaer

--
Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!