Блочное кэширование html-кода в TPL — различия между версиями
Материал из Umicms
VITL' (обсуждение | вклад) (Новая страница: «В данной статье представлен пример кастомного php-метода, с помощью которого можно сохрани…») |
(нет различий)
|
Версия 20:00, 28 сентября 2011
В данной статье представлен пример кастомного php-метода, с помощью которого можно сохранить результат выполнения tpl-макроса в кеш, на указанное время. Метод необходимо добавить в файл classes/modules/custom.php:
public function tplcache($expire = 0, $module = '', $method = '') {
$expire = (int) $expire;
$macrosArr = array();
$macrosArr['module'] = htmlspecialchars($module);
$macrosArr['method'] = htmlspecialchars($method);
$args = func_get_args();
$params = array_slice($args, 3);
$macrosArr['args'] = $params;
$params_path = '';
foreach($params as $arg){
if($params_path) $params_path .= ", '" . $arg . "'";
else $params_path .= "'" . $arg . "'";
}
// ключ для кеша
$path = $macrosArr['module'] . ' ' . $macrosArr['method'] . '('. $params_path . ')';
$templater = templater::getInstance();
$cacheFrontend = cacheFrontend::getInstance();
// проверка на активность поддерживаемого кеша, apc, eaccelerator, memcached и т.п.
if($cacheFrontend->getCurrentCacheEngineName()){
// загрузка данных из кеша, промежуточный ключ $path
if($data = $cacheFrontend->loadData($path)) {
return $data;
}
// выполнение метода, с указанными параметрами
$result = $templater->executeMacros($macrosArr);
if($expire > 0) {
// сохранение данных в кеш
$cacheFrontend->saveData($path, $result, $expire);
}
}else{
// использование файлового кеша, данные хранятся в html-файле
$cmsController = cmsController::getInstance();
$folder = CURRENT_WORKING_DIR . '/sys-temp/tplcache/';
if(!is_dir($folder)) mkdir($folder, 0777, true);
static $lang_id, $domain_id;
if(!isset($lang_id)) $lang_id = $cmsController->getCurrentLang()->getId();
if(!isset($domain_id)) $domain_id = $cmsController->getCurrentDomain()->getId();
$key_path = $path . '_' . $lang_id . '_' . $domain_id;
$key = sha1($key_path . SYS_CACHE_SALT);
$data_path = $folder . $key . '.html';
// проверка даты создания файла и времени жизни кеша (expire)
if(is_file($data_path)){
$mtime = filemtime($data_path);
if(time() < ($mtime + $expire)) {
return file_get_contents($data_path);
}
}
$result = $templater->executeMacros($macrosArr);
file_put_contents($data_path, $result);
}
return $result;
}
В методе стоит проверка на то, включен ли один из стандартных кеширующих механизмов, в случае если кеш включен, то он и используется, в ином случае используется файловый кеш. Данные файлового кеша сохраняются в папке /sys-temp/tplcache/.
Пример стандартного вызова tpl-макроса:
%news lastlist('/vse_novosti/politicheskie_novosti/ /vse_novosti/novosti_ekonomiki/', 'home', 2)%
Пример вызова макроса через кастомный метод tplcache:
%custom tplcache(600, 'news', 'lastlist', '/vse_novosti/politicheskie_novosti/ /vse_novosti/novosti_ekonomiki/', 'home', 2)%
600 - время хранения кеша; news - модуль; lastlist - метод модуля; далее параметры метода в стандартном порядке, как в документации