이곳 XETOWN pr님께서 개발해주신 pr_hit_lists 위젯의 경우에
슈퍼캐시의 위젯캐시 기능을 통해서 캐싱을 설정하면
위젯의 style(틀)은 유지가 되는데 내용이 비어져서 출력이 되는 경우가 종종 있더라구요
예를들어 XETOWN의 위젯을 예를 들어서 보여드리자면
<<원래 보여야 할 위젯>>
<<슈퍼캐시 위젯 캐싱 사용시 보이는 위젯>>
아래와같이 위젯껍데기(제목)을 제외하고는 로드되지가 않습니다
물론 새로고침 몇번하면 정상으로 돌아오는 경우도 있긴 한데
이 부분은 위젯의 코드가 문제일까요?
<?php class pr_hit_lists extends WidgetHandler { function proc($args) { $limit_count = $args->lists_count ? $args->lists_count : 10; $hit_lists = Context::get('pr_hit_list'); if(!$hit_lists) { $hit_lists = array(); } if(count($hit_lists) > $limit_count) { $hit_lists = array_slice($hit_lists, 0, $limit_count); } Context::set('hit_lists', $hit_lists); // Set a path of the template skin (values of skin, colorset settings) $tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin); Context::set('colorset', $args->colorset); // Compile a template $oTemplate = TemplateHandler::getInstance(); return $oTemplate->compile($tpl_path, 'list'); } }
네, 위젯의 구조가 캐싱에 적합하지 않은 것 같습니다.
캐싱은 $args를 기준으로 이루어지기에, 모든 위젯은 $args로 넘겨받은 값들을 이용하여 (쿼리를 한다든지, 외부 API에서 뭔가를 불러온다든지 하는 방법으로) 일정한 결과를 만들어내야 합니다. 그런데 저 위젯은 $args와 무관한 Context::get('hit_pr_list')라는 외부 데이터를 기준으로 결과를 생성하고 있습니다. 외부 데이터가 있는지 없는지, 무엇이 들어 있는지에 따라 다르게 동작하는 것이지요. 이런 위젯은 슈퍼캐시는 물론이고 코어 자체의 캐시 기능과도 호환되지 않을 가능성이 높습니다.