2016-10-31 4 views
0

* .png 그림을 생성하는 PHP 스크립트가 있는데 이 아니고은 서버에 저장합니다. 해당 사진은 동일한 사용자에게 반복해서 표시됩니다. 나는 캐시 그 사진을 찾는 방법을 찾고 있어요. 304 상태 헤더를 보낼 수 있지만 브라우저는 처음 새로 고침 할 때 캐시 된 것으로 웹 페이지를 선언하지만 웹 페이지는 공백으로 표시됩니다. Web-inspector를 두 번째 새로 고친 후에도 아무 것도 표시되지 않습니다.동적으로 생성 된 이미지를 캐시하는 방법은 무엇입니까?

누군가 나를 도울 수 있고 내가 엉망인 곳을 말할 수 있습니까?

노트 :

  • 나는 this post을 읽었습니다하지만 나에게 도움이되지 않았다.
  • MAMP (PHP 버전 7.0.10) 사용
  • 나는 못생긴 코드에 대한 사과입니다. 여기

파일의 메인 라인이다 : 당신의 도움에 대한

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 

감사

답변

0

서버는 브라우저가 여전히 이미지 캐시가 없거나한다고 생각 여부를 여기에서 결정하는 사람입니다 . 분명히 그것에 대한 권위는 거의 없습니다. 브라우저가 이 아닌 이유는 여러 가지가 있습니다.에 이미지가 캐시되어 있습니다 (예 : inspector 도구를 열면 (일반적으로 캐싱이 비활성화됩니다). the HTTP headersIf-None-MatchETagsIf-Modified-Since을 시간 기반 만료을 위해 :

브라우저 캐시 상태에 대한 서버를 알리기위한 메커니즘을 가지고있다. 이 두 헤더 중 하나라도 요청에 포함되어 있으면 브라우저에 자원의 캐시 된 사본이 아직 저장되어 있고 자원을 다시 다운로드하는 대신 기꺼이 304 응답을 수락 함을 의미합니다.

응답에 ETag 헤더를 설정하면 브라우저가 If-None-Match을 사용하여 다른 요청을 수행합니다 (기본적으로 쿠키 메커니즘을보다 안정적으로 대체합니다). 만료일을 설정하면 브라우저는 If-Modified-Since 헤더를 사용하여 서버를 다시 확인합니다. 그것은 당신이 당신의 304 응답을 기반으로해야합니다.

예 사용 ETag를 :

$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

당신이 @deceze 감사합니다! 그래서 내 코드는 이제 [this] (http://pastebin.com/7NwDTerH)처럼 보입니다. 하지만 여전히 캐시하지 않습니다. [These] (http://pastebin.com/W9812psa)는 내가받는 헤더입니다. 1. MAMP에서 "APC"또는 "OPCache"를 활성화해야합니까? 2.'session_start();'가 필요합니까? 3.'Pragma = no-cache'로 인해 문제가 발생합니까? 많은 양의 질문에 사과드립니다. – Faegy

+0

APC 등은이 종류의 캐시와 관련이 없습니다. 그리고 네,'Pragma no-cache'는 여기서 비생산적인 것처럼 보입니다. – deceze

+0

또한 '날짜'와 '만료'는 동일하므로 즉시 만료됨을 유의하십시오. – deceze