2016-10-31 2 views
0

J'ai un script php qui génère des images * .png mais pas les stocker sur le serveur. Ces images seront montrées à un même utilisateur à plusieurs reprises. Je cherche un moyen de cache ces images. Je suis en mesure d'envoyer l'en-tête de statut 304, le navigateur déclare également la page Web comme mise en cache au premier rafraîchissement (comme il est visible dans le web-inspecteur), mais la page Web est affichée vide. Après une seconde actualisation, même l'inspecteur Web est vide. Est-ce que quelqu'un peut m'aider et dire où j'ai foiré?Comment mettre en cache des images créées dynamiquement?

Notes:

  • J'ai lu this post mais il ne m'a pas aidé.
  • En utilisant MAMP (PHP version 7.0.10)
  • Je suis un débutant, mes excuses pour le code moche.

Voici les principales lignes du fichier:

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 

Merci pour votre aide

Répondre

0

Votre serveur est celui de décider ici si elle pense que le navigateur doit encore avoir le cache d'image ou non . De toute évidence, ce n'est pas vraiment l'autorité à cet égard. Il existe un certain nombre de raisons pour lesquelles le navigateur peut et non avoir l'image mise en cache, par ex. si vous ouvrez les outils de l'inspecteur (ce qui désactive généralement la mise en cache).

Le navigateur dispose d'un mécanisme pour informer le serveur sur son état de cache: the HTTP headersIf-None-Match pour ETags et If-Modified-Since pour expiration en fonction du temps. Si l'un de ces deux en-têtes est présent dans la requête, cela signifie que le navigateur dispose toujours d'une copie de la ressource mise en cache et accepte volontiers une réponse 304 au lieu de télécharger à nouveau la ressource.

Si vous définissez un en-tête ETag dans votre réponse, le navigateur fera une autre demande en utilisant If-None-Match (qui remplace essentiellement votre mécanisme de cookie, de manière plus fiable); Si vous définissez simplement une date d'expiration, le navigateur vérifie à nouveau avec le serveur à l'aide de l'en-tête If-Modified-Since. Voilà sur quoi vous devriez baser votre réponse 304.

Exemple d'utilisation: 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

Merci @deceze! Donc, mon code ressemble à [this] (http://pastebin.com/7NwDTerH). Mais il ne cache toujours pas. [These] (http://pastebin.com/W9812psa) sont les en-têtes que je reçois. 1. Dois-je activer "APC" ou "OPCache" sur MAMP? 2. Ai-je besoin de 'session_start();'? 3. Est-il possible que 'Pragma = no-cache' provoque le problème? Désolé pour la grande quantité de questions. – Faegy

+0

APC etc. n'a rien à voir avec ce type de cache. Et oui, 'Pragma no-cache' semble contre-productif ici. – deceze

+0

Notez également que vos 'Date' et' Expires' sont identiques, ce qui signifie qu'il expire immédiatement. – deceze