PHP3에서의 캐시리미터
여기서는 PHP의 header() 함수를 이용하여 PHP4 세션함수에서 제공하는 session_cache_limiter() 함수를 흉내내어 보고자 합니다.
[code php;gutter:false] class cacheLimiter {

var $value = "no setting";

function CacheControl($maxage=10800) {
switch ($this->value) {
case "nocache" :
header("expires: Thu, 19 Nov 1981 08:52:00 GMT");
header("cache-control: no-store, no-cache, must-revalidate,
post-check=0, pre-check=0");
header("pragma: no-cache");
break;
case "private" :
header("expires: Thu, 19 Nov 1981 08:52:00 GMT");
header("cache-control: private, max-age=$maxage, pre-check=$maxage");
header("last-modified: ".gmdate("D, j M Y H:i:s", time() - 896)." GMT");
break;
case "public" :
header("expires: ".gmdate("D, j M Y H:i:s", time() + 3600*3)." GMT");
header("cache-control: public, max-age=$maxage");
header("last-modified: ".gmdate("D, j M Y H:i:s", time() - 896)." GMT");
break;
}
}

function limiter($value="") {
$old = $this->value;
if (is_string($value) && "" != $value) {
$this->value = $value;
$this->CacheControl();
}
return $old;
}

} [/code]
[code php;gutter:false] $cache = new cacheLimiter;
$prev_limiter = $cache->limiter("nocache");
$curr_limiter = $cache->limiter();

echo "prev_limiter=[$prev_limiter], curr_limiter=[$curr_limiter]\n"; [/code]
사용방법은 PHP4 Manual에 있는 session_cache_limiter() 함수와 동일(?)합니다. 메소드 limiter()는 현 캐시 제한자명(the name of the current cache limiter)을 돌려 줍니다. 입력 인자로 public/private/nocache 중 하나로 지정하게 되면 현 캐시 제한자명이 지정된 이름으로 변경됩니다. 메소드 limiter()를 실행하지 않으면 서버에서는 캐시와 관련된 응답 메시지를 브라우저로 보내지 않습니다. 따라서 현재 브라우저에서 설정한 캐시 설정값에 따라 캐시가 동작하게 됩니다. 이것은 PHP4 세션과 다르게 동작하는 부분입니다. PHP4 세션에서는 session_cache_limiter() 함수를 명시하지 않으면 PHP.INI의 설정 옵션 session.cache_limiter에 설정된 값에 따라 캐시가 동작합니다.
PHP4에서의 캐시리미터
클래스 cacheLimiter는 PHP4에서 세션함수를 사용하지 않는 일반 문서에서 캐시를 제어할 때도 사용할 수 있습니다.
캐시리미터 클래스의 헤더메시지 설정값
캐시리미터 클래스에서 각 캐시 제한자명에 대한 설정값을 정하는데 있어 기준이 된 것은 역시 session_cache_limiter() 함수입니다. 이 함수에 의해 응답되는 HTTP 헤더 메시지를 직접 모니터링하여 얻은 값을 기준으로하여 각 제한자에 대한 설정값을 정하였습니다.
캐시리미터 클래스를 사용할 때 발생하는 에러
캐시리미터 클래스가 내부적으로 header() 함수를 사용하기 때문에 header() 함수를 사용할 때의 제약점과 같은 제약이 있습니다. 즉, 캐시리미터 클래스에 정의된 limiter() 함수는 일반적인 HTML 태그 또는 PHP로부터 보내지는 실제의 출력 이전에 호출되어야 합니다.
끝으로 한마디
40줄도 안되는 클래스 하나 작성하는데 참고해야 할 자료는 만만치 않은 것 같습니다. 세셔너함수를 작성하다보니 골치아픈 캐시 문제까지 건드리게 되었습니다. 캐시리미터 클래스가 완벽하게(?) 동작하지는 않겠지만 여러분이 캐시를 이해하는데는 다소나마 도움이 될 것이라 생각하여 관련 자료를 정리하여 공개합니다. 혹시 여러분이 캐시 제어를 프로그래밍하는데 도움이 될 수 있는 관련된 자료가 있으면 함께 공개되었으면 합니다. 사실 여기에서는 브라우저 캐시를 중심으로 살펴보았지만, 캐시에는 브라우저 캐시보다 더 복잡한 프록시 캐시도 있고 서버에서 제공하는 서버 캐시도 있습니다. 아마 캐시 문제를 완전히 이해하시려면 이 모든 캐시가 어떻게 동작되는지를 잘 알고 있어야 할 것으로 봅니다. 여러분의 건투를 빕니다.
이젠 캐시리미터도 만들어 봤으니 조만간 세셔너함수에 session_cache_limiter() 함수를 추가하여 공개하겠습니다.

Posted by 방글24