캐시핸들러 – 2.생성자 및 초기 설정값

생성자(constructor)

생성자에서는 캐시를 초기화하기 위한 작업을 수행하며 캐시핸들러를 동작시키는데 필요한 각종 설정값을 사용자로부터 전달받아 처리합니다.

생성자를 통해 사용자가 전달할 수 있는 설정값으로는 캐시 ID(id), 저장디렉토리(path), 캐시 데이터 생존 시간(maxlifetime) 및 청소 주기(period)가 있습니다.

<표1> 캐시핸들러의 초기 설정값
매개변수명 인덱스 기본값 동작 저장매체
캐시 ID id “_HW_CACHE_ID” 캐시 데이터가 저장될 파일명 또는 데이터베이스 필드명을 의미 all
생존 시간 maxlifetime 2,592,000초(30일) 캐시 데이터의 생존 시간을 의미 all
청소 주기 period 259,200초(3일) garbage collection을 수행할 주기 all
저장 디렉토리 path “/tmp” 캐시 데이터가 저장될 서버상의 디렉토리 파일 시스템용
디비 호스트명 host “localhost” 디비 호스트명 MySQL용
디비 사용자명 user none 디비 사용자명 MySQL용
디비 패스워드 pass none 디비 패스워드 MySQL용
디비명 base none 디비명 MySQL용
디비 테이블명 table “hcache” 디비 테이블명 MySQL용
접속방식 connect “pconnect” 접속방식 MySQL용

캐시 ID(cache id)

사용자와 캐시 데이터를 연결하기 위해서는 캐시 ID가 필요합니다. 파일시스템에서는 캐시 ID가 파일명으로 사용되며, 데이터베이스 시스템에서는 필드명으로 사용됩니다.

예를 들어 캐시 저장 디렉토리에 “my.cache”라는 이름으로 캐시 데이터를 저장하려면 생성자의 인수 중에 캐시 ID를 아래와 같이 “my.cache”로 지정합니다.

생존 시간(maxlifetime)

캐시 데이터의 생존 시간은 캐시 데이터가 생성된 시간을 기준으로 이 데이터가 유효한 기간을 초로 나타낸 것입니다. 예를 들어 캐시 데이터가 생성된 후 1시간(3600초) 동안만 유효하도록 하려면 생성자의 인수 중에 생존 시간을 아래와 같이 지정합니다.

그러면 캐시 데이터를 읽어들일 때 캐시 데이터가 생성된 후 1시간이 지나지 않은 것만 읽어들이며 1시간이 지났다면 해당 캐시 데이터가 없는 것과 같이 false를 반환합니다.

또한 불필요한 캐시 데이터를 청소 주기에 따라 청소할 때 생존 기간이 지난 캐시 데이터를 강제로 전부 지우게 됩니다.

청소 주기(garbage collection period)

destory() 함수를 통해 캐시 데이터를 강제로 지울 수도 있으나 수시로 생성되는 캐시 데이터를 사용자가 일일히 지우기에는 여러가지 제한이 많이 있습니다.

이러한 이유로 캐시 데이터는 보통 생존 시간(maxlifetime) 설정을 통해 캐시 데이터가 생성된 후 얼마나 지난 후에 캐시 데이터가 삭제되어야 할 지 지정하게 됩니다.

그러나 모든 사용자가 웹문서에 접근할 때마다 캐시 데이터를 청소(garbage collection)한다면 서버에 상당한 부하(overhead)를 주게 됩니다. 이러한 문제를 해결하기 위해 캐시핸들러에서는 청소 주기(garbage collection period) 설정을 통해 일정한 주기마다 한번씩만 청소하도록 하였습니다.

기본값으로는 3일(259,200초)로 설정되어 있습니다. 캐시 데이터가 짧은 시간에 너무 많이 생성된다면 서버가 캐시 파일에 접근하는데 문제가 발생할 수도 있습니다. 따라서 서버 상황에 따라, 또는 캐시 데이터가 얼마나 많이 생성되느냐에 따라 이 주기를 적절히 조정하는 것이 좋을 것입니다. 캐시 데이터가 많이 생성될수록 청소 주기를 짧게 하여야 겠지요.

청소 주기를 0으로 설정하면 garbage collection을 수행하지 않습니다. 이 경우에 특정 캐시 데이터를 지우려면 destroy() 함수를 이용하든지 아니면 쉘 스크립트를 통해 서버를 뒤져서 직접 지워주셔야 합니다.

저장 디렉토리(path to cache)

기본적으로 파일시스템용 캐시핸들러에서 캐시 데이터는 “/tmp”에 저장됩니다.

서버 디렉토리 “/tmp”는 서버에 계정을 가지고 있는 모든 회원이 공용으로 사용할 수 있는 임시 디렉토리로 전혀 보안이 되지 않습니다. 즉, 회원이면 누구든지 /tmp 디렉토리에 있는 파일의 내용을 아무런 제한없이 살펴볼 수 있습니다. 따라서 서버를 다수가 공유하여 사용하는 경우에는 캐시 데이터를 저장할 디렉토리를 자신만이 접근할 수 있는 곳으로 변경하는 것이 좋습니다.

예를 들어 “./cache”라는 자신만의 디렉토리에 캐시 데이터를 저장하려면 생성자의 인수 중에 저장 디렉토리를 아래와 같이 지정합니다.

캐시 저장 디렉토리는 읽기/쓰기를 할 수 있어야 하기 때문에 리눅스의 경우 퍼미션을 아래와 같이 설정하여 주시기 바랍니다.

  • chmod a+rwx 캐시 저장 디렉토리

디렉토리의 소유자 또는 퍼미션을 재설정하기 위한 chown 또는 chmod 사용법은 리눅스 쉘 Manual을 참조하세요.

윈도우 서버라면 디렉토리 속성을 읽기전용이 되지 않도록 설정하세요.

데이터베이스 접속 방식(connection type)

접속방식에는 “connect”와 “pconnect”를 지정할 수 있습니다. “connect”는 쿼리하는 동안에만 일시적으로 데이터베이스와 연결하는 방식이며, “pconnect”는 일단 데이터베이스와 연결된 후에는 일정시간동안 연결상태가 계속 유지되는 방식입니다.

저장 매체별 정의된 클래스명

생성자에서는 캐시를 초기화하기 위한 작업을 수행하며 캐시핸들러를 동작시키는데 필요한 각종 설정값을 사용자로부터 전달받아 처리합니다.

생성자를 통해 사용자가 전달할 수 있는 설정값으로는 캐시 ID(id), 저장디렉토리(path), 캐시 데이터 생존 시간(maxlifetime) 및 청소 주기(period)가 있습니다.

<표2> 저장 매체별 클래스명
저장매체 정의된 클래스명 클래스 파일
파일 시스템용 hCacheFile class.hCacheFile.php
MySQL용 hCacheMysql class.hCacheMysql.php

저장 매체에 관계없이 “hCache”라는 클래스명을 사용할 수 있습니다. “hCache” 클래스는 “hCacheFile” 또는 “hCacheMysql” 클래스를 상속받아 정의된 자식 클래스입니다.

“hCache” 클래스로는 하나의 저장 매체만 접근할 수 있습니다. 먼저 문서에 포함된 클래스에게 우선권이 있습니다.

답글 남기기