Volker Schmitt: Bilder aus MySQL-DB im Browsercache

Hallo Allerseits,

Ich habe eine MySQL Bilddatenbank, in welcher die Thumbnails direkt als BLOB abgespeichert werden. Anzeigen der Bilder funktioniert über PHP (z.B.: showimage.php?ID=123). Die Bilder werden lokal vom Browser gecached (getestet mit IE und NC). Beim Neuladen der Seite werden die Bilder jedoch immer erneut abgerufen und nie aus dem Cache geholt. Wie kann ich den Browser dazu überreden seinen Cache genauso wie bei normalen Bilddateien zu verwenden.

Bin für jeden Hinweis dankbar

Volker

  1. Hallo!

    Ich habe eine MySQL Bilddatenbank, in welcher die Thumbnails direkt als BLOB abgespeichert werden. Anzeigen der Bilder funktioniert über PHP (z.B.: showimage.php?ID=123). Die Bilder werden lokal vom Browser gecached (getestet mit IE und NC). Beim Neuladen der Seite werden die Bilder jedoch immer erneut abgerufen und nie aus dem Cache geholt. Wie kann ich den Browser dazu überreden seinen Cache genauso wie bei normalen Bilddateien zu verwenden.

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

    Es ist nicht gutalle Thumbnails in der mySQL abzulegen.
    siehe: http://www.koehntopp.de/php/databases.html#db-blob

    Lege nur die Dateinamen in der mySQL ab und Du hast das Cacheproblem gelöst.

    MfG, André Laugks

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

      Und "?ID=123" ist ja kein Bild..., was exsistiert.

      MfG, André Laugks

    2. 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?

      Lege nur die Dateinamen in der mySQL ab und Du hast das Cacheproblem gelöst.

      Das bringt mir keinen Gewinn, da die Bilddateien nicht öffentlich auf dem http-server liegen dürfen, sondern jeder Benutzer nur seine Bilder sehen darf. Ich bräuchte dann zumindest immer noch ein Script, das etwa so aussieht:

      if (seesion_is_registered("verified_user"))
      {
      readfile("$imgpath")
      }

      Mir fällt keine Lösung ein, die ohne Script+Parameterübergabe funktioniert und gleichzeitig die Bilder vor unerlaubtem Zugriff schützt.

      Volker

      1. 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

        1. Hallo,

          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).

          Sowas ähnliches habe ich mir vorgestellt, allerdings habe ich eben eine viel einfachere Methode gefunden. Ich speichere die Bilder nicht in der Datenbank, sondern als Datei abgelegt in einem Verzeichnis mit http-Zugriff. Allerdings packe ich ein kurzes php-script direkt in das Bild und nenne es einfach "123.php". Somit existiert das Bild als Datei, ist aber dennoch für unerlaubten
          Zugriff gesperrt. Zwar geht dann jedes Bild durch den PHP-Parser aber bei kleinen Thumnails lässt sich das wohl verkraften.

          So funktionierts!!

          <?php
          session_start();
          if(session_is_registered("verified_user"))
          {
            header("Content-type:image/gif");
          }
          else {
            header("Location: noaccess.gif");
          }
          ?>
          GIF89a,,öUvwuxxx .... (Bild)

          Vielen Dank für die Anregungen

          Volker