PHP 와 브 라 우 저 캐 시 에 대한 분석

저 희 는 서버 에서 캐 시 설정 에 대해 각종 최적화 방안 을 실시 하지만 클 라 이언 트 캐 시 를 잘 모 릅 니 다.정확히 말 하면 브 라 우 저의 캐 시 체제 입 니 다.사실 모든 브 라 우 저 는 캐 시 정책 이 있 습 니 다.탐색 한 파일 을 특수 한 폴 더 에 잠시 캐 시 합 니 다.사용자 가 페이지 요청 을 반복 할 때 이 페이지 가 변경 되 지 않 았 고 캐 시 를 호출 할 수 있 음 을 알려 줄 수 있 습 니 다.그럼 사용자 가 이 페이지 의 캐 시 데 이 터 를 가지 고 있 는 지 어떻게 압 니까?사실 브 라 우 저 는 요청 을 보 낼 때 http 헤드 를 먼저 보 냅 니 다.일반적으로 다음 과 같 습 니 다.Date:Sun,30 Jul 2006 09:18:11 GMTContent-Type:image/gifLast-Modified:Wed,19 Jul 2006 07:40:06 GMTETag:"8c55da8d6abc 61:2327"Content-Length:14757 그 중에서 Last-Modified:Wed,19 Jul 2006 07:40:06 GMTETag:"8c55da8d6abc 61:2327"은 페이지 의 캐 시 정보 입 니 다.그리고 서버 가 돌아 오 는 응답 코드 가 HTTP 200(OK)이 아 닌 304 이면 브 라 우 저 는 캐 시 에서 데 이 터 를 읽 습 니 다./클 라 이언 트 브 라 우 저 에 게 캐 시,HTTP 1.1 프로 토 콜 을 사용 하지 않 음 을 알려 줍 니 다.  header("Cache-Control: no-cache, must-revalidate");  //클 라 이언 트 브 라 우 저 에 게 캐 시 를 사용 하지 않 고 HTTP 1.0 프로 토 콜 을 호 환 하도록 알려 줍 니 다.  header("Pragma: no-cache");  이 원리 에 따라 자주 업데이트 되 지 않 거나 자주 새로 고침 해 야 하 는 페이지 에 사용 하면 서버 의 부담 을 크게 줄 일 수 있 습 니 다.클 라 이언 트 에 캐 시 가 있 는 것 을 발견 하면 클 라 이언 트 에 304 응답 을 보 내 고 프로그램의 실행 을 중단 할 수 있 기 때 문 입 니 다.브 라 우 저가 보 낸 요청 에는 If-Modified-Since 와 If-None-Match 두 개의 인자 가 포함 되 어 있 습 니 다.첫 번 째 는 데이터 의 마지막 수정 시간 이 Thu 인지 물 어 보 는 것 을 의미 합 니 다.2008 년 6 월 19 일 16:24:01 GMT 이후 서버 는 데이터 의 마지막 수정 시간 을 검사 합 니 다.이 시간 이 라면 상태 코드 304(수정 되 지 않 았 음 을 표시 합 니 다)를 되 돌려 줍 니 다.이 때 브 라 우 저가 상태 코드 를 304 로 받 았 을 때 데 이 터 를 다운로드 하지 않 고 로 컬 캐 시 에서 호출 합 니 다.그러나 로 컬 캐 시 에 이 요청 자원 의 데이터 가 존재 할 때 만 브 라 우 저 는 If-Modified-Since 인 자 를 보 내 고 그 값 은 지난번 서버 가 되 돌아 온 Last-Modified 값 입 니 다(모든 서버 가 If-Modified-Since 와 If-None-Match 를 지원 하 는 것 은 아 닙 니 다).If-None-Match 의 기능 도 비슷 합 니 다.서버 가 되 돌아 오 는 Etag 의 값 으로 생 성 되 었 습 니 다.임의의 값 일 수 있 습 니 다.서버 가 데 이 터 를 검사 하 는 수정 시간 만 되 돌려 주 는 역할 을 하기 때 문 입 니 다.none(기본 값)이 아니 거나 비어 있 지 않 으 면 됩 니 다.따라서 저 희 는 코드 의 맨 앞 부분 에 탐색 한 Etag 를 특정한 값 으로 설정 한 다음 에 이 자원 이 두 번 째 요청 을 받 았 을 때 If-None-Match 인 자 를 추가 할 수 있 습 니 다.그 값 이 확실히 보 낸 Etag 값 인지 확인 하면 서버 를 304 로 지정 하고 프로그램 을 강제로 종료 하면 됩 니 다.If-Modified-Since 도 마찬가지 입 니 다.여기 서 etag 방법 만 제시 하 는 phop 버 전(Last-Modified 버 전 은 너무 흔 합 니 다.예 를 들 어 캐 시 시간 초과 설정 등):PHP 코드 를 클립보드

    if ($_SERVER["HTTP_IF_NONE_MATCH"] == "claymorephp.com")
    {
        header('Etag:'.'zhaiyun.com',true,304);
        exit();
    }
    else {
        header('Etag:'."claymorephp.com");
    }
    :
    $expires=date("Ymd"); //
    if ($_SERVER["HTTP_IF_NONE_MATCH"] == $expires)
    {
        header('Etag:'.$expires,true,304);
        exit();
    }
    else {
        header('Etag:'.$expires);
    }
if ($_SERVER["HTTP_IF_NONE_MATCH"] == "claymorephp.com") { header('Etag:'.'zhaiyun.com',true,304); exit(); } else { header('Etag:'."claymorephp.com"); } : $expires=date("Ymd"); // if ($_SERVER["HTTP_IF_NONE_MATCH"] == $expires) { header('Etag:'.$expires,true,304); exit(); } else { header('Etag:'.$expires); }
로 복사 합 니 다.또한 GZIP 과 ETAG 가 동시에 사용 할 때 문제 가 발생 할 수 있 습 니 다.바로 ETAG 가 가치 가 없다 는 것 입 니 다.이 문 제 는 보편적으로 존재 합 니 다.저 는 관련 된 이 유 를 찾 지 못 했 습 니 다.인터넷 을 한참 뒤 졌 는데,보편적 인 사람들 은 BUG 라 고 부른다.상기 원인 을 바탕 으로 PHPBLOG 에 대한 클 라 이언 트 캐 시 는 다음 과 같이 처 리 됩 니 다(동시에 HTTPIF_NONE_MATCH 와 HTTPIF_MODIFIED_SINCE 판단):PHP 코드 를 클립보드

      if($_SERVER['HTTP_IF_NONE_MATCH'])
        {
            if($_SERVER['HTTP_IF_NONE_MATCH'] == 'phpblog')
            {
                header('Etag:phpblog',true,304);//
                $_SESSION['time_end']=microtime(true);
                exit();
            }
        }
        else if($_SERVER['HTTP_IF_MODIFIED_SINCE'])//eg:Sun, 02 Nov 2008 07:08:25 GMT; length=35849
        {
            $array=explode(' ',$_SERVER['HTTP_IF_MODIFIED_SINCE']);
            $gmday=$array[1];
            $month_array=array(
            "Jan"=>"01",
            "Feb"=>"02",
            "Mar"=>"03",
            "Apr"=>"04",
            "May"=>"05",
            "Jun"=>"06",
            "Jul"=>"07",
            "Aug"=>"08",
            "Sep"=>"09",
            "Oct"=>"10",
            "Nov"=>"11",
            "Dec"=>"12");
            $gmmonth=$month_array[$array[2]];
            $gmyear=$array[3];
            $array=explode(':',$array[4]);
            $gmtimestamp=gmmktime($array[0],$array[1],$array[2],$gmmonth,$gmday,$gmyear);
            if(gmmktime()-$gmtimestamp<$config_client_cache_time*60*60)
            {
                header('Etag:phpblog',true,304);//
                $_SESSION['time_end']=microtime(true);
                exit();
            }
        }
if($_SERVER['HTTP_IF_NONE_MATCH']) { if($_SERVER['HTTP_IF_NONE_MATCH'] == 'phpblog') { header('Etag:phpblog',true,304);// $_SESSION['time_end']=microtime(true); exit(); } } else if($_SERVER['HTTP_IF_MODIFIED_SINCE'])//eg:Sun, 02 Nov 2008 07:08:25 GMT; length=35849 { $array=explode(' ',$_SERVER['HTTP_IF_MODIFIED_SINCE']); $gmday=$array[1]; $month_array=array( "Jan"=>"01", "Feb"=>"02", "Mar"=>"03", "Apr"=>"04", "May"=>"05", "Jun"=>"06", "Jul"=>"07", "Aug"=>"08", "Sep"=>"09", "Oct"=>"10", "Nov"=>"11", "Dec"=>"12"); $gmmonth=$month_array[$array[2]]; $gmyear=$array[3]; $array=explode(':',$array[4]); $gmtimestamp=gmmktime($array[0],$array[1],$array[2],$gmmonth,$gmday,$gmyear); if(gmmktime()-$gmtimestamp<$config_client_cache_time*60*60) { header('Etag:phpblog',true,304);// $_SESSION['time_end']=microtime(true); exit(); } }
캐 시 에 복사 한 HEADER 는 이렇게 보 냅 니 다.PHP 코드 를 클립보드

     $client_cache_time=$config_client_cache_time*60*60;// -
            header('Cache-Control: public, max-age='.$client_cache_time);
            header('Expires: '.gmdate('D, d M Y H:i:s',time()+$client_cache_time).' GMT');//
            header('Last-Modified: '.gmdate('D, d M Y H:i:s',time()).' GMT');//
            header('Pragma: public');
            header('Etag:phpblog');// , ( )
$client_cache_time=$config_client_cache_time*60*60;// - header('Cache-Control: public, max-age='.$client_cache_time); header('Expires: '.gmdate('D, d M Y H:i:s',time()+$client_cache_time).' GMT');// header('Last-Modified: '.gmdate('D, d M Y H:i:s',time()).' GMT');// header('Pragma: public'); header('Etag:phpblog');// , ( )
에 복사 합 니 다.

좋은 웹페이지 즐겨찾기