Martin: Grafik beim Seitenbesuch definitiv neu laden...

Hallo,

ein mit Sicherheit bekanntes Thema, aber ich weiß es im Augenblick nicht wirklich zu lösen.
Ich erstelle mittels PHP Funktionen ein neues Bild und speichere es auf dem Webserver. Jetzt besucht jemand eine Seite der Website und das Bild wird generiert und von PHP gespeichert. Im weiteren Verlauf des Seitenaufbaus wird es dann vom jeweiligen Browser ausgelesen und angezeigt, soweit so gut.
Problem liegt aber wohl daran, das die Dateien vom Browser gechached werden, denn ruft man danach eine weitere Seite auf, wird von dem PHP Programm wohl eine neue angepasste Grafik erzeugt und gespeichert, aber der Browser zeigt die alte an.
Erst wenn man mit F5 neu lädt, dann holt er sich die aktuelle Datei.

Wie kann ich ihm nun sagen, das er definitv bei einer solchen Seite die aktuelle Datei vom Server laden soll?
Ggf. ein Befehl, mit dem nur diese Datei geladen wird, es brauchen aufgrund von Zeitersparnis ja nicht alle Grafiken neu geladen zu werden...

Vielen Dank schonmal für eure Hilfe

Gruß
Martin

  1. Hallo,
    Es gibt zahlreiche META-Tags ("Cache Control" u.ä.), die das verhindern sollen, jedoch nur begrenzt tun.

    Es geht aber mit einem kleinen Trick:
    Du erzeugst mit PHP eine Zufallszahl und hängst diese mit "?" an das Bild an, sodass der ausgelieferte HTML-Code dann ungefähr so aussieht:

    <img src="bild.jpg?zahl=2435735">

    Wenn der Browser seinen Request abestzt, denkt er, es handele sich bei dem Bild um ein Skript, welches einen Parameter erhält, und läd deswegen das Bild nicht aus dem Cache.
    Der WebServer hingegen ingoriert die Zahl einfach, und wirft Dir einfach das Bild aus.

    Hoffe, das hilft.

    Viele Grüße,
    Jörg

    1. Hi Jörg,

      Wenn der Browser seinen Request abestzt, denkt er, es handele sich bei dem Bild um ein Skript, welches einen Parameter erhält, und läd deswegen das Bild nicht aus dem Cache.

      nein, nicht weil er denkt es ist ein script, sondern ganz einfach weil es ein anderes bild ist (bild.jpg?123456 ist was andres als bild.jpg?456789)

      Gruß, Marian

      1. Hallo,

        nein, nicht weil er denkt es ist ein script, sondern ganz einfach weil es ein anderes bild ist (bild.jpg?123456 ist was andres als bild.jpg?456789)

        Jo, das ist ja kein Widerspruch - aber Parameter in HTTP-GET-Requests werden doch üblicherweise mit ? angehängt.
        Also kann man  imo(vereinfacht gesprochen) davon reden, dass der Server "denkt, es wäre ein Skript": Der Webserver sucht eine ressource mit "bild.jpg?id=656464" und wenn er sie nicht findet, dröselt er die Parameter hinter ? auf, und sucht ein Objekt mit Namen "bild.jpg" im filesystem.

        1. hi,

          Also kann man  imo(vereinfacht gesprochen) davon reden, dass der Server "denkt, es wäre ein Skript": Der Webserver sucht eine ressource mit "bild.jpg?id=656464" und wenn er sie nicht findet, dröselt er die Parameter hinter ? auf, und sucht ein Objekt mit Namen "bild.jpg" im filesystem.

          nö, das macht er nicht.
          der weiß gleich bescheid, dass bild.jpg der name der angeforderten ressource ist, und der rest "nur" query string.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
    2. <img src="bild.jpg?zahl=2435735">

      Wenn der Browser seinen Request abestzt, denkt er, es handele sich bei dem Bild um ein Skript, welches einen Parameter erhält, und läd deswegen das Bild nicht aus dem Cache.
      Der WebServer hingegen ingoriert die Zahl einfach, und wirft Dir einfach das Bild aus.

      Hallo nochmal,

      so, ausprobiert!
      Hmh, klappt nur bedingt.
      Die Variante oben klappt eigentlich gar nicht, kommt nur "Seite kann nicht angezeigt werden" (wenn man es jetzt mal einzeln aufruft)
      Offensichtlich kann man nicht einfach was hinters Bild packen, also nach der ".jpg" Endung....
      Die Datei steht auch so auf dem Server "datei.jpg?id=1234" Wird natürlich auch vom Server nicht mehr als Bild erkannt...

      Wenn man die Zufallszahl in den Dateinamen schreibt klappt es natürlich.

      ABER! Problem ist, das bei erneutem Aufruf ja eine neue Zufallszahl erzeugt wird und dann bei jedem Aufruf also eine neue Datei erstellt wird, genau das wollte ich ja nicht, habe ich ja hinterher 1000de Dateien...

      Somit müßte man zumindest die Datei später wieder löschen, aber wie. Sie wird erzeugt und gespeichert. Dann baut das PHP die HTML Seite zusammen und schickt sie an den Browser. Damit ist für den Server und die PHP Seite die Arbeit erledigt und der Browser arbeitet das HTML ab.
      Jetzt erst wird ja die Datei mitgeladen und könnte erst später gelöscht werden, das wäre aber sehr schwer machbar, weiß man ja nicht, was der User als nächstes anklickt und macht...

      Also noch nicht ganz so serienreif, oder habe ich was übersehen...

      1. hi,

        Offensichtlich kann man nicht einfach was hinters Bild packen, also nach der ".jpg" Endung....
        Die Datei steht auch so auf dem Server "datei.jpg?id=1234" Wird natürlich auch vom Server nicht mehr als Bild erkannt...

        es war nicht die rede davon, dass du die bilddatei unter diesem namen auf dem server abspeichern sollst - das wäre ziemlich hirnrissig.

        du solltest lediglich bei der einbindung dieses bildes in HTML per <img src="bilddateiname.jpg?id=1234" ...> einen GET-parameter anhängen, der den browser veranlasst, dass bild noch mal neu zu laden.

        _für den client_ wird es dadurch zu einer neuen ressource.
        _für den server_ ist es jedes mal wieder die datei bildname.jpg - bei deren aufruf zusätzlich noch ein GET-parameter übergeben wird, für den sich ein bild aber herzlich wenig interessiert.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. AUA, AUA!!!

          Ja, Mist, bin ich DOOF!
          Jetzt muß ich mich selbst 6-Feet-Under begraben, nein, ist das peinlich....

          Klar, nur der Aufruf darf den Parameter enthalten, ist doch klar, wieso seh' ich den Wald wieder vor lauter Bäumen nicht, ich Dummpaddel...

          Ach, über so etwas kann ich mich ja wieder ärgern, wie steh' ich jetzt wieder da....

          Ok, natürlich funzt es jetzt, alles wird wieder gut, danke, echt danke!

          Gruß
          Martin, der der sich jetzt hinter seinen PC verkriecht... ;-)

          1. Hallo ;)

            Klar, nur der Aufruf darf den Parameter enthalten, ist doch klar, wieso seh' ich den Wald wieder vor lauter Bäumen nicht, ich Dummpaddel...

            Naja, diese Request-Ummodelei ist ja jetzt auch nicht wirklich intuitiv.

            "Ich hole mir dieselbe Datei, aber häng soviel Unfug dran, dass der Cache zu dumm ist, es mitzubekommen, aber der Webserver clever genug, das richtige auszuliefern"

            Wenn sich Brower-Caches und Proxies endlich an sachen wie Meta-Tags usw. halten würden, wär das alles halb so wild.

  2. Hallöchen,

    ja, danke, der Trick könnte funzen, das teste ich gleich mal aus.

    Auch wenn es alles andere als die feine englische Programmierart ist :o))), aber man will ja Lösungen und nicht unbedingt einen tollen Quellcode *grins

    Wenn es nicht funzt melde ich mich nochmal...