캐시핸들러 개요
캐시(cache)는 임시 저장소로 캐시핸들러는 캐시에 저장된 데이터를 관리하는 기능을 제공합니다. 캐시핸들러의 캐시 관리 기능은 PHP4에서 제공하는 세션 관리 기능을 모델링하였기 때문에 사용방법이 세션 관리 기능과 유사함을 알 수 있습니다.
캐시핸들러가 어떻게 캐시 데이터를 열고, 읽고, 쓰고, 닫는 지와 더 이상 필요하지 않은 쓰레기를 어떻게 지우는 지에 대하여 하나씩 살펴보도록 하겠습니다.
캐시핸들러 동작 수순
캐시핸들러는 아래 그림과 같이 가장 먼저 생성자 내에서 캐시핸들러가 동작하는데 필요한 초기화작업을 수행한 후 캐시를 열기 위해 open() 함수를 수행합니다.
<그림1> 캐시 동작 수순
캐시가 열린 후에는 각각의 캐시 데이터에 대한 작업이 close() 함수를 하기 전에 반복적으로 수행됩니다. 이 때 수행되는 함수는 save_id(), read(), write(), destroy() 함수가 있습니다.
각각의 캐시 데이터에 대한 작업이 완료되면 close() 함수를 수행하여 캐시를 닫습니다. close() 함수가 수행된 이후에는 각각의 캐시 데이터에 대한 작업을 할 수 없습니다.
캐시핸들러를 이용하여 응용프로그램을 작성할 때 close() 함수는 많은 경우에 응용프로그램의 소멸자(또는 사용자 정의 소멸자)에서 수행하게 될 것입니다.
아래는 실제로 캐시핸들러를 이용하여 작성된 예제입니다.
[code php;gutter:false] <?php
/**
* 처리하려는 캐시 데이터 id를 배열에 담는다.
*/
$cache_files = array(
"test1.cache",
"test2.cache",
"test3.cache"
);

/**
* 캐시핸들러의 객체를 생성한다.
*
* 초기에 처리할 캐시파일명을 test.cache으로 설정
* 청소 주기를 1년(31,536,000초)으로 설정
* 생존 시간을 5년(157,680,000초)으로 설정
* "./cache/my" 디렉토리에 캐시 저장
*/
$cache = new hCache(array(
"id" => "test.cache",
"period" => 31536000,
"maxlifetime" => 157680000,
"path" => "./cache/my"
));

/**
* 캐시를 연다.
*/
$cache->open();

/**
* 생성자에서 설정한 캐시파일 "./cache/my/test.cache"를 지운다.
* 이 파일이 처음부터 없었다면 false가 반환되었을 것이다.
*/
$cache->destroy();

/**
* "./cache/my" 디렉토리에 있는
* 캐시파일 "test1.cache", "test2.cache", "test3.cache"를
* 순서대로 읽어들여 그 내용에 "*"를 덧붙인다.
* 해당 캐시파일이 없으면 해당 캐시파일을 "./cache/my"에 생성한다.
*/
foreach($cache_files as $file) {
$cache->save_id($file);
$value = $cache->read();

if ($value) {
$value .= "*";
} else {
$value = "";
}

/**
* $value의 내용을 지정된 캐시파일에 저장한다.
*/
$cache->write($value);
}

/**
* 캐시를 닫는다.
*/
$cache->close();
?> [/code]
쓰레기 청소(garbage collection)
더 이상 사용되지 않는 불필요한 캐시 데이터에 대하여는 open() 함수 내에서 자동적으로 지워주며, 때에 따라서는 destroy() 함수를 이용해 특정 캐시 데이터를 강제로 지울 수 있습니다.
캐시 데이터
저장하기 위해 캐시핸들러로 전달된 데이터는 문자열이어야 합니다. 따라서 배열과 같은 데이터를 캐시에 저장하기 위해서는 먼저 serialize() 함수를 통해 문자열로 만든 후 캐시핸들러 write() 함수로 전달하여야 합니다.
아래 그림은 배열값이 어떻게 캐시되는지를 보여줍니다.
<그림2> 배열값의 캐싱
저장 매체
캐시 데이터는 서버에 저장하게 되므로 필요에 따라 파일시스템은 물론 데이터베이스 및 공유메모리 등을 이용할 수 있습니다.
저장 매체의 분류
캐시핸들러에는 파일시스템용, MySQL용이 포함되어 있습니다.
<표1> 캐시핸들러의 저장매체
구분 파일 MySQL용
저장매체 파일 시스템 MySQL 데이터베이스
오라클 데이터베이스 또는 공유메모리와 같은 다른 저장매체를 이용하려면 파일 시스템용 또는 MySQL용 캐시핸들러를 참고하여 수정하면 별 어려움없이 작성할 수 있으리라 봅니다.
각 저장 매체의 장점
후키템풀릿에서와 같이 임시로 생성된 웹문서를 관리하는데는 대부분의 경우에 파일 시스템이 유리할 것으로 생각됩니다.
그러나 캐시 데이터의 수량과 용량이 거대하다면 데이터베이스 시스템이 더 유리할 수도 있습니다.
반면에 아주 간단한 캐시 데이터의 경우는 공유메모리를 이용하는 것이 나을 수도 있겠지요.
캐시핸들러의 응용
현재 캐시핸들러를 이용하여 작성된 응용프로그램으로는 후키템플릿이 있습니다. 후키템플릿에서 캐시핸들러가 어떻게 응용되었는가에 관심이 있으시다면 후키템플릿 정보에서 "캐시를 이용하는 방법"을 참조바랍니다.

Posted by 방글24