2012-09-03 4 views
1

나는 내 웹 사이트의 배경 이미지를 PHP 스크립트이며 이미지를 출력으로 사용하는 서버의 URL로 설정하고 있습니다.PHP를 통해 제공되는 이미지를 캐시하는 방법은 무엇입니까?

//$mime is usually image/jpeg, etc 
    header("Content-type: $mime"); 
    $image = readfile($image); 
    imagejpeg($image); 

문제는, 내 페이지를로드 할 때마다, 이미지가 아니라 캐시되지 않고 다시로드 할 것 : 여기에 대한 코드입니다. 그것에 대해 할 수있는 일이 있습니까? 예 : 이미지를 캐시하기 위해 헤더를 보내려면?

+0

올바른 캐시 헤더/컨트롤을 제공하십시오. 또한 파일을 완전히 읽지 않고 변경 사항을 확인하려면 "현명하게"읽어야합니다. –

+0

@pst 무엇입니까? - –

답변

4

항상 ETag (a md5 해시)와 마지막으로 수정 한 날짜 (일반적으로 파일을 만든 날짜)를 사용하면 최상의 결과를 얻을 수 있습니다.

코드는 다음과 같이 될 것입니다에 대한

:

$etag = md5_file($image); 
$lastModified = gmdate('D, d M Y H:i:s', filemtime($image)) . ' GMT'; 


header("Content-type: $mime"); 
header("ETag: \"{$etag}\""); 
header("Last-Modified: $lastModified"); 
header('Expires: ' . gmdate("D, d M Y H:i:s", ((60*60*24*45)+strtotime($lastModified)))); // add 45 days expire 

$image = readfile($image); 
imagejpeg($image); 
+0

왜 downvote? .. 제발 .. –

+0

파이어 폭스에서 일하는 것 같지만, 크롬에서는 항상 크롬에서 항상 나를 위해 –

+0

이 작동 할 때마다 이미지를로드하는 것처럼 보입니다. 새로 고침을 하시겠습니까? 새로 고침을 할 때 Chrome에서 모든 항목을 새로 고침한다는 사실을 알고 있어야합니다. 링크를 클릭하면 해당 페이지가 다시로드됩니다. –

1

를 사용하여 마지막으로 수정 된 헤더 필드와 과거의 날짜로 모든 시간을 설정합니다.

이렇게하면 브라우저가 서버에서 "수정되지 않은"답장을 받고 캐시 된 버전의 이미지를 사용하게됩니다.

+0

브라우저는 당신이 그걸 보내라고 말하면 Not Modified 만받습니다. . If-Modified-Since 및 이와 유사한 것을 요구합니다. (또는 다른 레이어가 헤더를 검사 할 수 있습니다, 나는 PHP 또는 호스팅 메커니즘 작동하는지 모르겠습니다.) –

1

나는 이미지 파일이 마지막으로 수정 된 날짜를 알려주는 헤더를 추가 제안 :

header("Last-Modified: " . gmdate("D, d M Y H:i:s", filemtime($image)) . " GMT"); 
header("Content-type: $mime"); 
$image = readfile($image); 
imagejpeg($image); 

이 방법은 브라우저가 이미지를 캐시 할 수 있습니다.

+0

이것은 시작입니다. 그러나 브라우저가 리소스를 다시 요청하지 못하도록 (따라서 이미지를 다시 가져 오는 것을) 막지는 못합니다. 여전히 Last-Modified 헤더가 있습니다. Last-Modified는 클라이언트의 If-Modified-Since 헤더 (기타)와 함께 사용하도록 설계되었습니다. (또는 다른 계층 헤더를 검사 할 수, 나는 PHP 또는 호스팅 메커니즘을 작동하는지 모르겠습니다.) –

관련 문제