Блочное кэширование html-кода в TPL
Материал из Umicms
Версия от 05:53, 15 августа 2012; Kalexey (обсуждение | вклад)
В данной статье представлен пример кастомного 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 - метод модуля; далее параметры метода в стандартном порядке, как в документации