>  기사  >  백엔드 개발  >  PHP 파일로 생성된 이미지를 CDN에서 캐시할 수 없는 문제에 대한 솔루션

PHP 파일로 생성된 이미지를 CDN에서 캐시할 수 없는 문제에 대한 솔루션

PHPz
PHPz원래의
2016-05-16 20:13:001117검색

오늘 온라인에서 문제를 발견했습니다. 온라인 이미지 도메인 이름의 경우 CDN 캐시가 프런트 엔드에 추가되었습니다. 캐시가 삭제되지 않으면 PHP를 사용하여 이미지 크기 조정을 동적으로 구현합니다. PHP로 처리한 결과가 출력될 때마다 오류가 발생합니다. 백엔드에서 읽으려면 백엔드 서버의 부담이 순간적으로 증가합니다. 분석 결과 PHP에는 304 처리가 없는 것으로 나타났습니다. HTTP의 경우는 서버에 요청할 때마다 수정 여부를 감지하고, 수정 사항이 없으면 직접 304 상태 코드를 반환하여 클라이언트의 캐시를 사용하는 것이 CDN의 원칙입니다. 304를 설정하면 해당 URL이 캐시됩니다.

관련 코드는 다음과 같습니다.

//检测有没改变
if (isset($_SERVER['HTTP_IF_NONE_MATCH'])){
    $etag = $_SERVER['HTTP_IF_NONE_MATCH'];
    if (md5($this->image) === $etag){
        header("HTTP/1.1 304 Not Modified");
        exit;
    }
}
 
header("Last-Modified: " . gmdate("D, d M Y H:i:s", strtotime('2011-1-1'))." GMT");
//输出etag头
header('etag:' . md5($this->image));
header('Cache-Control:max-age=2592000');echo $this->image;

그 중 http 헤더 HTTP_IF_NONE_MATCH 일반적으로 서버에서 반환된 특정 URL의 식별입니다. 일반적으로 MD5를 사용하여 계산되므로 MD5 값 쌍을 감지할 수 있습니다. 아니요, 동일하면 304를 반환합니다. 오랫동안 패키지를 집었고 서버에서 반환된 Etag 레이블만 보았지만 클라이언트의 http 헤더에 If-None-Match가 표시되지 않아 fastcgi를 사용할 수 없었습니다. 다음을 추가하세요. .conf.default에 대한 코드:

코드는 다음과 같습니다.


$_SERVER가 인쇄되면 CACHE_ETAG 변수가 전혀 없습니다. . nginx는 관련 HTTP 헤더를 $_SERVER 변수에 넣을 것으로 보이며 이는 또한 http 프로토콜에 대한 이해를 심화시킵니다
fastcgi_param  CACHE_ETAG    $http_if_none_match;
더 많은 관련 튜토리얼을 보려면
PHP 프로그래밍에 대한 전체 비디오 튜토리얼 세트를 방문하세요. 입문부터 마스터까지
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.