Monday, May 2, 2016

XeHookFpc

Xpressengine full page cache handler


간단하게 구현한 xpressengine 의 풀 페이지 캐쉬 프로그램입니다.
모듈이나 애드온 형태가 아닙니다.
몇달전에 xpressengine 설치해서 돌려보니 상당히 무겁다는것을 체감한후 속도 개선을 위해 간단하게 제작한 프로그램입니다.
테스트는 1.7.4에서 진행 했었고 공개하기전 1.7.5에서도 간단하게 해보았습니다.
작동을 위해서는 우선적으로 Memcached 설정이 활성화 되어져 있어야 합니다.
개발된 코드(xe-hook-fpc)와 일치하는 작동을 위해서는 cpage, page 등의 변수등에 대한 skin 설정도 정확하게 이루어져야 합니다.
조회수 업데이트 및 리스트 업데이트등의 동적인 페이지 구현에 있어서 몇가지 문제점들을 가지고 있는 프로그램입니다.
사용시에 유의하세요!

프로젝트 홈


https://github.com/vozlt/xe-hook-fpc

요구사항


  • Xpressengine(1.7.4+)
  • Memcached

Xpressengine memcached 설정


이미 설정 되어 있다면 생략
$ vi [Installed xpressengine path]/files/config/db.config.php

'use_object_cache' => 'memcache://localhost:11211'

설치


$ git clone git://github.com/vozlt/xe-hook-fpc.git

$ cd xe-hook-fpc

$ bash install.sh install [Installed xpressengine path]

삭제


$ cd xe-hook-fpc

$ bash install.sh uninstall [Installed xpressengine path]

테스트 환경


OS: centos6(x86_64)
WEB: nginx
PHP: php-fpm-5.5, php-opcache-5.5
MYSQL: mysql-5.6

적용 전후 함수들의 호출 수


액션 적용시 미적용시
document 7177 518
list 4862 455

xhprof 를 사용해서 분석한 내용이며 페이지 로딩 속도 및 시스템의 부하 또한 비례 할 것입니다.(10배이상)

Xhprof 결과


xe-hook-fpc 미적용:document

enter image description here

xe-hook-fpc 적용:document

enter image description here

xe-hook-fpc 미적용:list

enter image description here

xe-hook-fpc 적용:list

enter image description here

기본 캐쉬 만료 시간


액션 만료시간(초)
index 300
list 3600
document 3600
comment 3600
searched result 3600
menu 3600

캐쉬 만료시간은 [xpressengine 설치경로]/config/config.user.inc.php 에서 설정 가능하며 0으로 설정하면 해당 action은 캐쉬하지 않습니다.

$ vi [Installed xpressengine path]/config/config.user.inc.php

define('__XE_HOOK_FPC_INDEX_EXPIRES__', 300); /* index's cache expires time(sec) */
define('__XE_HOOK_FPC_LIST_EXPIRES__', 3600); /* list's cache expires time(sec) */
define('__XE_HOOK_FPC_DOCUMENT_EXPIRES__', 3600); /* document's cache expires time(sec) */
define('__XE_HOOK_FPC_COMMENT_EXPIRES__', 3600); /* comment's cache expires time(sec) */
define('__XE_HOOK_FPC_SEARCH_EXPIRES__', 3600); /* searched result's cache expires time(sec) */
define('__XE_HOOK_FPC_MENU_EXPIRES__', 3600); /* menu's cache expires time(sec) */

캐쉬키 출력하기

$ vi layouts/[your layout path]/layout.html

<!--fpc:debug_info:s--><!--fpc:debug_info:e-->

레이아웃등에 위처럼 설정후 xe-hook-fpc 를 활성화 하고 정상적으로 캐쉬가 생성되면 아래처럼 html 에 출력 됩니다.

<!--debug_info{fpc:pc:ProcCacheDocument:board:1:0:login}-->

기타

xe-hook-fpc 구현시에 게시글(댓글포함)의 (추가|삭제|수정) 등의 변화시에 저장된 캐쉬를 삭제하는 처리는 해놓았지만 위에서 언급했듯이 
cpage, page 등등의 변수가 해당 동작(추가|삭제|수정)시에 정확하게 전달되어야 합니다.
동적인 처리를 위해 내부로직에서 조회수등의 치환등의 몇개 정보는 구현해 놓았으나 너무 많은 경우의 수로 인하여 언급하지 않겠습니다. 
그리고 솔직히 만든지 몇달 되기도 했고 xpressengine 내부적인 흐름도 모두 본것도 아니라서 제 환경에서는 대충 잘 동작하게는 했지만 다른분들은 어떨실지 모르겠습니다.
풀캐쉬로 인해 동적인 페이지 구현에 있어서 여러가지 단점은 존재하지만 잘 설정하시면 효과는 아마도 깜짝 놀라실 거에요:)


Post a Comment