2016-10-31 1 views
0

Ich habe ein PHP-Skript, das * .png Bilder erzeugt, aber nicht speichert sie auf dem Server. Diese Bilder werden wiederholt demselben Benutzer angezeigt. Ich suche nach einem Weg zu Cache diese Bilder. Ich bin in der Lage, den 304-Status-Header zu senden, der Browser deklariert auch die Webseite als zwischengespeichert bei der ersten Aktualisierung (wie es im Web-Inspector sichtbar ist), aber die Webseite wird leer angezeigt. Nach einer zweiten Aktualisierung zeigt auch der Web-Inspektor nichts.Wie können dynamisch erstellte Bilder zwischengespeichert werden?

Kann mir jemand helfen und sagen, wo ich versagt habe?

Hinweise:

  • Ich habe this post gelesen, aber es hat mir nicht geholfen.
  • Verwendung von MAMP (PHP Version 7.0.10)
  • Ich bin ein Neuling, ich entschuldige mich für den hässlichen Code.

Hier sind die wichtigsten Linien der Datei:

session_start(); 
header("Content-type: image/jpeg"); 
//A little require_once() here on some functions stored in an other file. 
$originalSource = getSource($_GET['src']); 
if (isset($_COOKIE[sha1($originalSource)]) && $_COOKIE[sha1($originalSource)]) { 
    header("HTTP/1.1 304 Not Modified"); 
    die; 
} else { 
    setcookie (sha1($originalSource), true, time()+10); 
    $offset = 10; 
    $expire = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT"; 
    header($expire); 
    header("Cache-Control: max-age=".$offset); 
    header("Last-Modified: Wed, 25 Feb 2015 12:00:00 GMT"); 
} 
//The entire image generation process after this 

Danke für Ihre Hilfe

Antwort

0

Ihr Server ist der hier zu entscheiden, ob es der Browser sollte immer noch das Bild gecached haben oder nicht denkt . Offensichtlich ist es kaum die Autorität dafür. Es gibt eine Anzahl von Gründen, warum der Browser nicht das Bild zwischengespeichert haben kann, z. wenn Sie die Inspektor-Tools öffnen (wodurch normalerweise das Caching deaktiviert wird).

Der Browser verfügt über einen Mechanismus zur Information des Servers über seinen Cache-Status: the HTTP headersIf-None-Match für ETags und If-Modified-Since für zeitbasierte Ablauf. Wenn einer dieser beiden Header in der Anfrage vorhanden ist, bedeutet dies, dass der Browser immer noch eine Kopie der Ressourcen im Cache hat und gerne eine 304 Antwort akzeptiert, anstatt die Ressource erneut herunterzuladen.

Wenn Sie einen Header ETag in Ihrer Antwort setzen, wird der Browser eine andere Anfrage mit If-None-Match (die im Wesentlichen ersetzt Ihre Cookie-Mechanismus, zuverlässiger); Wenn Sie nur ein Ablaufdatum festlegen, überprüft der Browser erneut den Server mit dem Header If-Modified-Since. Darauf sollten Sie Ihre 304 Antwort basieren.

Beispiel mit ETags:

$hash = sha1($originalSource); 

header("Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT"); 

if (
    isset($_SERVER['HTTP_IF_NONE_MATCH']) && 
    trim($_SERVER['HTTP_IF_NONE_MATCH'], '"') === $hash 
) { 
    header("HTTP/1.1 304 Not Modified"); 
    exit; 
} 

header("Content-type: image/jpeg"); 
header("Cache-Control: max-age=$offset"); 
header("ETag: \"$hash\""); 

// output image 
+0

Danke @deceze! Also sieht mein Code jetzt wie folgt aus (http://pastebin.com/7NwDTerH). Es wird jedoch immer noch nicht zwischengespeichert. [Diese] (http://pastebin.com/W9812psa) sind die Header, die ich bekomme. 1. Muss ich "APC" oder "OPCache" auf MAMP aktivieren? 2. Benötige ich den 'session_start();'? 3. Ist es möglich, dass 'Pragma = no-cache' das Problem verursacht? Sorry für die große Menge an Fragen. – Faegy

+0

APC usw. hat nichts mit dieser Art von Cache zu tun. Und ja, 'Pragma no-cache' scheint hier kontraproduktiv. – deceze

+0

Beachten Sie auch, dass Ihr "Date" und "Expires" identisch sind, was bedeutet, dass es sofort abläuft. – deceze

Verwandte Themen