it-swarm.com.de

Deaktivieren Sie den Cache für einige Bilder

Ich generiere einige Bilder mit einer PHP -Lib.

Manchmal lädt der Browser die neu generierte Datei nicht. 

Wie kann ich den Cache nur für von mir dynamisch erstellte Bilder deaktivieren?

Hinweis: Ich muss im Laufe der Zeit denselben Namen für die erstellten Bilder verwenden.

88
dole doug

Eine gebräuchliche und einfache Lösung für dieses Problem, die sich wie ein Hack anfühlt, aber ziemlich tragbar ist, ist das Hinzufügen einer zufällig generierten Abfragezeichenfolge zu jeder Anforderung für das dynamische Image.

Also zum Beispiel -

<img src="image.png" />

Würde werden

<img src="image.png?dummy=8484744" />

Oder

<img src="image.png?dummy=371662" />

Aus Sicht des Webservers wird auf dieselbe Datei zugegriffen, aus Sicht des Browsers kann jedoch kein Caching durchgeführt werden.

Die Zufallszahlengenerierung kann entweder beim Servieren der Seite auf dem Server erfolgen (stellen Sie nur sicher, dass die Seite selbst nicht zwischengespeichert wird ...) oder auf dem Client (mithilfe von JavaScript).

Sie müssen überprüfen, ob Ihr Webserver diesen Trick bewältigen kann.

189
Hexagon

Browser-Caching-Strategien können über HTTP-Header gesteuert werden. Denken Sie daran, dass sie wirklich nur ein Hinweis sind. Da Browser in diesem (und in jedem anderen) Feld furchtbar inkonsistent sind, benötigen Sie mehrere Header, um den gewünschten Effekt für eine Reihe von Browsern zu erzielen.

header ("Pragma-directive: no-cache");
header ("Cache-directive: no-cache");
header ("Cache-control: no-cache");
header ("Pragma: no-cache");
header ("Expires: 0");
35
lhunath

Lösung 1 ist nicht großartig. Es funktioniert, aber wenn Sie am Ende Ihrer Bilddateien zufällige oder zeitgestempelte Abfragezeichenfolgen einfügen, wird der Browser erneut heruntergeladen und zwischenspeichern Sie jede Version jedes Bildes, jedes Mal, wenn eine Seite geladen wird, unabhängig davon, ob sich das Bild auf dem Server geändert hat oder nicht.

Lösung 2 ist nutzlos. Das Hinzufügen von nocache -Headern zu einer Image-Datei ist nicht nur sehr schwierig zu implementieren, sondern auch völlig unpraktisch, da dies erforderlich ist Sie können vorhersagen, wann es im Voraus benötigt wird, das erste Mal, wenn Sie ein Bild laden, von dem Sie denken, dass es könnte ändern sich irgendwann in der Zukunft.

Etags eingeben ...

Der absolut beste Weg , den ich gefunden habe, um dies zu lösen, ist die Verwendung von ETAGS in einer .htaccess-Datei in Ihrem Bilderverzeichnis. Im Folgenden wird Apache angewiesen, einen eindeutigen Hash in den Bilddatei-Headern an den Browser zu senden. Dieser Hash ändert sich immer nur, wenn die Bilddatei geändert wird. Diese Änderung veranlasst den Browser, das Bild bei der nächsten Anforderung neu zu laden.

<FilesMatch "\.(jpg|jpeg)$">
FileETag MTime Size
</FilesMatch>
12
cronoklee

Wenn Sie es im Browser mit Javascript dynamisch tun müssen, hier ein Beispiel ...

<img id=graph alt="" 
  src="http://www.kitco.com/images/live/gold.gif" 
  />

<script language="javascript" type="text/javascript">
    var d = new Date(); 
    document.getElementById("graph").src = 
      "http://www.kitco.com/images/live/gold.gif?ver=" + 
       d.getTime();
</script>
10

Ich habe alle Antworten geprüft und die beste schien es zu sein (was nicht so ist):

<img src="image.png?cache=none">

zu Beginn.

Wenn Sie jedoch cache = none hinzufügen (was statisch "none" Word ist), hat dies keinerlei Auswirkungen. Der Browser wird trotzdem aus dem Cache geladen.

Lösung für dieses Problem war:

<img src="image.png?nocache=<?php echo time(); ?>">

wenn Sie im Wesentlichen einen Unix-Zeitstempel hinzufügen, um den Parameter dynamisch und ohne Cache zu gestalten, hat es funktioniert.

Mein Problem war jedoch ein wenig anders: Ich lud während des Ladevorgangs ein PHP-Diagrammbild und kontrollierte die Seite mit den Parametern von $ _GET. Ich wollte, dass das Bild aus dem Cache gelesen wird, wenn der URL-Parameter GET gleich bleibt, und ich sollte nicht zwischenspeichern, wenn sich die GET-Parameter ändern.

Um dieses Problem zu lösen, musste ich $ _GET hashieren, aber da es sich um ein Array handelt, gibt es hier die Lösung:

$chart_hash = md5(implode('-', $_GET));
echo "<img src='/images/mychart.png?hash=$chart_hash'>";

Bearbeiten :

Obwohl die obige Lösung gut funktioniert, möchten Sie manchmal die zwischengespeicherte Version BIS bis die Datei geändert wird. (Bei der obigen Lösung wird der Cache für dieses Bild vollständig deaktiviert.) Um zwischengespeicherte Bilder vom Browser UNTIL zu liefern, ändert sich die Verwendung der Bilddatei:

echo "<img src='/images/mychart.png?hash=" . filemtime('mychart.png') . "'>";

filemtime () erhält die Änderungszeit für Dateien.

9
Tarik

Ich weiß, dass dieses Thema alt ist, aber es steht in Google sehr gut. Ich habe herausgefunden, dass es gut funktioniert, dies in den Header zu setzen.

<meta Http-Equiv="Cache-Control" Content="no-cache">
<meta Http-Equiv="Pragma" Content="no-cache">
<meta Http-Equiv="Expires" Content="0">
<meta Http-Equiv="Pragma-directive: no-cache">
<meta Http-Equiv="Cache-directive: no-cache">
3
Dimitri Visser

Das Ändern der Bildquelle ist die Lösung. Sie können dies tatsächlich tun, indem Sie dem Bild einen Zeitstempel oder eine Zufallszahl hinzufügen. 

Besser wäre es, eine Prüfsumme von zB den Daten hinzuzufügen, die das Bild darstellt. Dies ermöglicht, wenn möglich, das Caching.

3

Ich habe nur nach einer Lösung dafür gesucht, und die obigen Antworten haben in meinem Fall nicht funktioniert (und ich habe keinen ausreichenden Ruf, um sie zu kommentieren). Es stellt sich heraus, dass zumindest für meinen Anwendungsfall und den von mir verwendeten Browser (Chrome unter OSX) das einzige, was das Zwischenspeichern zu verhindern schien:

Cache-Control = 'no-store'

Der Vollständigkeit halber verwende ich jetzt alle 3 'no-cache, no-store, must-revalidate'.

In meinem Fall (das Erzeugen dynamisch generierter Bilder aus Flask in Python) musste ich Folgendes tun, um hoffentlich in so vielen Browsern wie möglich zu arbeiten ...

def make_uncached_response(inFile):
    response = make_response(inFile)
    response.headers['Pragma-Directive'] = 'no-cache'
    response.headers['Cache-Directive'] = 'no-cache'
    response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
    response.headers['Pragma'] = 'no-cache'
    response.headers['Expires'] = '0'
    return response
2
Mark

ich hatte dieses Problem und so überwinden. 

var newtags='<div class="addedimage"><h5>preview image</h5><img src="'+one+'?nocache='+Math.floor(Math.random() * 1000)+'"></div>';
1

Ich habe das verwendet, um mein ähnliches Problem zu lösen ... einen Bildzähler anzuzeigen (von einem externen Anbieter). Es wurde nicht immer richtig aktualisiert. Und nachdem ein zufälliger Parameter hinzugefügt wurde, funktioniert alles gut :)

Ich habe eine Datumszeichenfolge angehängt, um mindestens jede Minute eine Aktualisierung sicherzustellen.

Beispielcode (PHP):

$output .= "<img src=\"http://xy.somecounter.com/?id=1234567890&".date(ymdHi)."\" alt=\"somecounter.com\" style=\"border:none;\">";

Das ergibt einen src-Link wie:

http://xy.somecounter.com/?id=1234567890&1207241014
0
Pinoccio

Fügen wir dem Bündel eine weitere Lösung hinzu.

Das Hinzufügen einer eindeutigen Zeichenfolge am Ende ist eine perfekte Lösung. 

example.jpg?646413154

Die folgende Lösung erweitert diese Methode und bietet sowohl die Zwischenspeicherfunktion als auch das Abrufen einer neuen Version, wenn das Image aktualisiert wird.

Wenn das Bild aktualisiert wird, wird die filemtime geändert.

<?php
$filename = "path/to/images/example.jpg";
$filemtime = filemtime($filename);
?>

Jetzt das Bild ausgeben:

<img src="images/example.jpg?<?php echo $filemtime; ?>" >
0
Daniel

Wenn Sie eine hartcodierte Bild-URL haben, zum Beispiel: http://example.com/image.jpg können Sie PHP verwenden, um Kopfzeilen zu Ihrem Bild hinzuzufügen.

Zuerst müssen Sie Apache dazu bringen, Ihr JPG als PHP zu verarbeiten. Siehe hier: Ist es möglich, PHP mit der Erweiterung file.php.jpg auszuführen?

Laden Sie das Bild (imagecreatefromjpeg) aus der Datei und fügen Sie dann die Header der vorherigen Antworten hinzu. Verwenden Sie den PHP-Funktionsheader, um die Header hinzuzufügen. 

Dann geben Sie das Bild mit der Funktion imagejpeg aus.

Bitte beachten Sie, dass es sehr unsicher ist, PHP-JPG-Bilder verarbeiten zu lassen. Bitte beachten Sie auch, dass ich diese Lösung nicht getestet habe. Es liegt also an Ihnen, dass sie funktioniert.

0
Sam Sam