lindner: Dynamische Bilder

Hi,

ich arbeite gerade an einem PHP Script das Dynamische Bilder ausgibt,
und hab noch ein paar Probleme damit diese Bilder vom Browser Cachen zu lassen.
Die Bilder werden auch Serverseitig gecacht (readfile).

Pfad php Script (über mod_rewrite verändert):
http://www.linsinger.com/linsinger.com/image/669m316/media/2.jpg

Pfad gecachtes Image:
http://www.linsinger.com/linsinger.com/temp/s669x316_media_2.jpg

In den meisten Anleitungen für Dynamische Bilder wird ja einfach nur:
header("Content-Type: image/jpeg");
angegeben, was dann in meinem Fall zu folgenden Headers führt:

  
Generiert:  
HTTP/1.1 200 OK  
Date: Tue, 08 Jun 2010 08:58:46 GMT  
Server: Apache  
X-Powered-By: PHP/4.4.0  
Expires: Thu, 19 Nov 1981 08:52:00 GMT  
Cache-Control: no-store, no-cache, must-revalidate, post-check=0,pre-check=0  
Pragma: no-cache  
Set-Cookie: PHPSESSID=9bb7125ee5c00893b4df1d9326072b86; path=/  
Connection: close  
Transfer-Encoding: chunked  
Content-Type: image/jpeg  
  
Echte Jpg:  
HTTP/1.1 200 OK  
Date: Tue, 08 Jun 2010 09:01:07 GMT  
Server: Apache  
Last-Modified: Mon, 07 Jun 2010 12:03:27 GMT  
eTag: "219fde-e26c-75dce1c0"  
Accept-Ranges: bytes  
Content-Length: 57964  
Vary: Accept-Encoding  
Connection: close  
Content-Type: image/jpeg  

Nach einigen Stöbern bin ich nun auf diesem Stand:

  
header("Content-Type: image/jpeg");  
header("Cache-Control: public");  
header("Pragma: cache");  
header("Expires: ".gmdate("D, d M Y H:i:s",time()+86400)." GMT");  
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $datumDerOriginalDatei)." GMT");  
header("ETag: ".md5($InhaltDerOriginalDatei));  

Was zu folgenden Headers führt:

  
HTTP/1.1 200 OK  
Date: Tue, 08 Jun 2010 09:02:46 GMT  
Server: Apache  
X-Powered-By: PHP/4.4.0  
Cache-Control: public  
Pragma: cache  
Expires: Wed, 09 Jun 2010 09:02:46 GMT  
eTag: 9f9974d82450b9d46164acb1e80352c3  
Set-Cookie: PHPSESSID=9f367857471d211a84b4ae8d09a11239; path=/  
Last-Modified: Tue, 25 May 2010 17:32:52 GMT  
Connection: close  
Transfer-Encoding: chunked  
Content-Type: image/jpeg  

Allerdings scheint das generierte Bild immer noch nicht vom Browser
gecacht zu werden, an welchen Headers könnte das liegen?

thx, mfg lindsey

  1. hi,

    Allerdings scheint das generierte Bild immer noch nicht vom Browser
    gecacht zu werden, an welchen Headers könnte das liegen?

    Ein Browser schreibt den Cache, wenn die Datei mit den Headers

    Etag:
    Last-Modified:

    Ausgeliefert wird. Ein Browser holt die Datei aus dem Cache, wenn bei einem erneuten Request serverseitig festgestellt wird, dass sich die im Request mitgegebenen Werte für

    IF_NONE_MATCH
    IF_MODIFIED_SINCE

    nicht geändert haben, vorausgesetzt, der Server ist richtig konfiguriert. Es gibt jedoch auch Browser, die sind so eingestellt, dass sie gar nicht erst am Server nachfragen.

    Hotti

    1. Ein Browser schreibt den Cache, wenn die Datei mit den Headers

      Etag:
      Last-Modified:

      Ausgeliefert wird.

      Die Beiden Headers werden ja ausgeliefert?

      Ein Browser holt die Datei aus dem Cache, wenn bei einem erneuten Request serverseitig festgestellt wird, dass sich die im Request mitgegebenen Werte für

      IF_NONE_MATCH
      IF_MODIFIED_SINCE

      nicht geändert haben, vorausgesetzt, der Server ist richtig konfiguriert. Es gibt jedoch auch Browser, die sind so eingestellt, dass sie gar nicht erst am Server nachfragen.

      Die Server werden wohl richtig konfiguriert sein,
      das echte Jpg wird gecacht,
      und über das readfile php Script wirds immer neu geladen.

      Für das php Script wurde ja vom Server automatisch
      Pragma und Cache-Control "no-cache" ausgeliefert,
      mit welchen Werten überschreibt man das am besten?

      thx, mfg

  2. Hi,

    eTag: 9f9974d82450b9d46164acb1e80352c3
    Last-Modified: Tue, 25 May 2010 17:32:52 GMT

    Und entsprechende conditional GET requests behandelt dein aufgerufenes PHP-Script auch passend?

    Allerdings scheint das generierte Bild immer noch nicht vom Browser
    gecacht zu werden, an welchen Headers könnte das liegen?

    Vermutlich an denen, die dein Script ignoriert - bei der Anfrage durch den Client.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]