hTemplate – 1.7.캐시를 이용하는 방법

템플릿 사용으로 인한 수행속도 저하

HTML 문서 내에 직접 PHP 코드를 삽입하는 방식과 비교하면 템플릿을 이용할 때의 속도가 느려지게 될 것입니다. 아무래도 템플릿을 분석하는 등의 일을 하는데 시간이 걸리겠지요. 이 때의 시간이란 물론 서버상에서 템플릿을 처리하는 시간이 될 것입니다.

그러나 이러한 서버상에서의 처리 시간이 그대로 인터넷 사용자가 느끼는 체감속도와는 상당히 다릅니다. 인터넷에서 문서를 요구(request)받았을 때부터 사용자에게 응답(response)될 때까지 웹문서 데이터가 이동하는 시간을 분석해 보면 서버에서 데이터가 처리되는 시간은 데이터가 인터넷망에 머무는 시간에 비해 수천분의일 정도 밖에 안될 것입니다. 따라서 서버상에서의 처리속도가 수십배 정도 느려졌다고 해도 인터넷 사용 체감속도가 느려졌다고 느끼는 분은 별로 없을 것입니다. 오히려 다른 요소들에 의해 체감속도가 들숙날숙할테니까요.

처리속도 향상을 위한 방안

그렇다고 서버 수행 속도가 마냥 느려서야 곤란하겠지요. 한 두사람 접속한다면 모르지만 수백명, 수천명이 동시에 접속한다면 서버의 수행속도는 매우 중요한 문제가 될 것입니다.

이러한 이유로 여러분도 템플릿툴 사용을 꺼리고 계시겠지요. 그러나 “구더기 무서워 장 못 담그겠습니까?” 일단 장은 담고 봐야죠(장을 담가야만 하는 이유는 앞장 “템플릿 사용에 따른 이점”을 참조바람). 그리고 나서 구더기(수행속도 저하)가 생기지 않도록 조치를 취해야 겠지요.

이러한 방안으로 템플릿툴에 캐시 개념을 도입하게 됩니다. 템플릿 파일이 변경되었을 때만 캐시 데이터를 업데이트 시켜주게 되면 다음부터는 템플릿 파일을 분석하는 일 없이 캐시된 문서를 바로 웹브라우저에 보여줄 수가 있기 때문에 PHP 코드 삽입 방식과 거의 속도 차이를 느낄 수 없을 것입니다. 대부분의 공개된 자료에서는 최종 웹페이지 문서를 캐시에 저장하는 방식을 사용합니다. 그러나 hTemplate에서는 define() 함수에 의해 처리된 결과로 얻어진 템플릿 정보를 캐싱하는 방식을 지원합니다. 이 방식의 장점은 템플릿 파일 내용이 변경될 때마다 캐시데이터를 자동적으로 업데이트할 수 있다는 것입니다.

캐시 적용 클래스

FastTemplate의 경우 이러한 캐시 개념을 도입한 CachedFastTemplate가 공개되어 있습니다. 궁금하신 분은 www.codelib.co.kr에 가서 검색해 보세요.

hTemplate는 템플릿 자료구조가 변경되어 CachedFastTemplate을 이용할 수 없습니다. 따라서 hTemplate에서 캐시를 이용할 수 있도록 hTemplate와는 별도로 캐시핸들러 클래스(hTemplate 캐시핸들러)를 제공합니다.

< 캐시 적용 >

템플릿을 캐시하기 위해 사용되는 hTemplate 캐시핸들러는 hTemplate과는 독립적으로 작성되어 있으며 기본적으로 파일시스템을 이용하지만 데이터베이스와 같은 캐시 저장 매체로 쉽게 변경 및 확장할 수 있습니다. hTemplate 캐시핸들러에 대한 자세한 내용은 메뉴 “캐시핸들러”를 참조바랍니다.

hTemplate의 동작

캐시에 저장된 템플릿 정보를 이용하여 HTML 문서를 생성할 때는 템플릿 문서를 읽고 컴파일하는 과정을 생략합니다.

< 캐시를 이용할 때의 동작순서 >

캐시 핸들러의 동작

캐시템플릿에서는 아래 그림과 같이 생성자 내에서 open, gc, destroy, read 핸들러가 동작되며, 강제로 update 할 때는 destroy 핸들러가 동작되고 그렇지 않으면 read 핸들러가 동작됩니다.

< 캐시 핸들러 동작 순서 >

write, close 핸들러의 동작

0.0.4 이전 버전에서는 FastPrint() 함수가 처음 실행될 때 write, close 핸들러가 동작됩니다.

1.0.0 버전부터는 register_shutdown_function()로 지정된 콜백함수 내에서 캐시됩니다. zend engine 2.0이 탑재된 PHP 5.0.0 dev 이상 버전에서는 콜백함수 대신에 소멸자를 이용합니다.

1.2.0 버전부터는 PHP4&5 모두 register_shutdown_function()로 지정된 콜백함수 내에서 캐시됩니다.

정적 캐시(Static Cache) 및 동적 캐시(Dynamic Cache)

1.2.0 이전 버전에서는 하나의 홈페이지 문서에 하나의 캐시만 존재하도록 작성되어 있습니다. 즉 하나의 홈페이지 문서를 생성하는데 여러 개의 템플릿 파일이 이용되더라도 하나의 캐시로 통합됩니다. 하나의 문서에 하나의 캐시를 생성하는 것이 관리상 편리할 수도 있겠으나 때에 따라서는 템플릿 파일별로 캐시가 작성되는 것도 유용할 것입니다.

이를 위하여 1.2.0 버전에서는 특정 홈페이지 문서에 고정적으로 따라다니는 정적 캐시(Static Cache)와 홈페이지 문서와 관계없이 템플릿 파일별로 작성되어 홈페이지 문서에서 필요에 따라 동적으로 불러들일 수 있도록 작성된 동적 캐시(Dynamic Cache)로 구분되어 동작합니다.

define() 함수의 세번째 인자인 배열의 첨자 ‘cache_type’을 지정하지 않거나 상수 _TPL_CACHE_STATIC를 지정하면 정적 캐시(Static Cache)로 저장되며, 상수 _TPL_CACHE_DYNAMIC를 지정하면 동적 캐시(Dynamic Cache)로 저장됩니다.

캐시디렉토리에 저장된 캐시파일명을 보면 이전 버전에서는 아래와 같았습니다.

  • blog@index.php(site_index).hcache.php

웹루트에서 시작되는 파일명 ‘blog/index.php’에서 ‘/’ 를 ‘@’로 치환한 후 ‘(캐시id).hcache.php’를 붙인 형태입니다. 1.2.0 버전에서는 아래와 같이 캐시파일명 형식이 변경되었습니다.

  • sn@site_index@blog@index.php.hcache.php

첫번째 문자 ‘s’는 정적캐시(Static Cache)를 의미하며, 정적캐시가 아니고 동적캐시(Dynamic Cache)의 경우에는 첫번째 문자가 ‘d’로 기록됩니다.

[1.2.0] 두번째 문자 ‘n’은 active_html_compress가 false인 경우, 즉 캐시에 저장된 HTML 문서가 압축하지 않은 경우(no compress)를 의미하며, 만약 캐시에 저장된 HTML 문서가 압축된 상태, 즉 active_html_compress가 true라면 압축(compress)를 의미하는 ‘c’ 문자가 기록될 것입니다.

[1.3.0] 캐시에 저장된 문서를 압축하느냐 하지않느냐를 결정하는 인자는 active_html_compress이 아니라 active_cache_compress입니다. 따라서 active_cache_compress가 false이면 두번째 문자가 ‘n’이 되고, true면 ‘c’가 되도록 수정합니다.

‘site_index’은 캐시id를 의미하고, blog@index.php는 파일명 ‘blog/index.php’을 의미하고 ‘hcache.php’는 hTemplate 캐시 클래스에서 사용하는 첨자입니다.

답글 남기기