Блочное кеширование html-кода в TPL
Материал из Umicms
В данной статье представлен пример кастомного 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 - метод модуля; далее параметры метода в стандартном порядке, как в документации
