Блочное кэширование html-кода в TPL — различия между версиями
VITL' (обсуждение | вклад) (Новая страница: «В данной статье представлен пример кастомного php-метода, с помощью которого можно сохрани…») |
Deez (обсуждение | вклад) |
||
(не показаны 3 промежуточные версии 2 участников) | |||
Строка 1: | Строка 1: | ||
− | В данной статье представлен пример кастомного php-метода, с помощью которого можно сохранить результат выполнения tpl-макроса в | + | В данной статье представлен пример кастомного php-метода, с помощью которого можно сохранить результат выполнения tpl-макроса в кэш, на указанное время. Метод необходимо добавить в файл '''classes/modules/custom.php''': |
<source lang="php"> | <source lang="php"> | ||
public function tplcache($expire = 0, $module = '', $method = '') { | public function tplcache($expire = 0, $module = '', $method = '') { | ||
Строка 17: | Строка 17: | ||
else $params_path .= "'" . $arg . "'"; | else $params_path .= "'" . $arg . "'"; | ||
} | } | ||
− | // ключ для | + | // ключ для кэша |
$path = $macrosArr['module'] . ' ' . $macrosArr['method'] . '('. $params_path . ')'; | $path = $macrosArr['module'] . ' ' . $macrosArr['method'] . '('. $params_path . ')'; | ||
$templater = templater::getInstance(); | $templater = templater::getInstance(); | ||
$cacheFrontend = cacheFrontend::getInstance(); | $cacheFrontend = cacheFrontend::getInstance(); | ||
− | // проверка на активность поддерживаемого | + | // проверка на активность поддерживаемого кэша, apc, eaccelerator, memcached и т.п. |
if($cacheFrontend->getCurrentCacheEngineName()){ | if($cacheFrontend->getCurrentCacheEngineName()){ | ||
− | // загрузка данных из | + | // загрузка данных из кэша, промежуточный ключ $path |
if($data = $cacheFrontend->loadData($path)) { | if($data = $cacheFrontend->loadData($path)) { | ||
return $data; | return $data; | ||
Строка 31: | Строка 31: | ||
if($expire > 0) { | if($expire > 0) { | ||
− | // сохранение данных в | + | // сохранение данных в кэш |
$cacheFrontend->saveData($path, $result, $expire); | $cacheFrontend->saveData($path, $result, $expire); | ||
} | } | ||
}else{ | }else{ | ||
− | // использование файлового | + | // использование файлового кэша, данные хранятся в html-файле |
$cmsController = cmsController::getInstance(); | $cmsController = cmsController::getInstance(); | ||
Строка 46: | Строка 46: | ||
$key = sha1($key_path . SYS_CACHE_SALT); | $key = sha1($key_path . SYS_CACHE_SALT); | ||
$data_path = $folder . $key . '.html'; | $data_path = $folder . $key . '.html'; | ||
− | // проверка даты создания файла и времени жизни | + | // проверка даты создания файла и времени жизни кэша (expire) |
if(is_file($data_path)){ | if(is_file($data_path)){ | ||
$mtime = filemtime($data_path); | $mtime = filemtime($data_path); | ||
Строка 59: | Строка 59: | ||
} | } | ||
</source> | </source> | ||
− | В методе стоит проверка на то, включен ли один из стандартных | + | В методе стоит проверка на то, включен ли один из стандартных кэширующих механизмов, в случае если кэш включен, то он и используется, в ином случае используется файловый кэш. Данные файлового кэша сохраняются в папке '''/sys-temp/tplcache/'''. |
Пример стандартного вызова tpl-макроса: | Пример стандартного вызова tpl-макроса: | ||
Строка 69: | Строка 69: | ||
%custom tplcache(600, 'news', 'lastlist', '/vse_novosti/politicheskie_novosti/ /vse_novosti/novosti_ekonomiki/', 'home', 2)% | %custom tplcache(600, 'news', 'lastlist', '/vse_novosti/politicheskie_novosti/ /vse_novosti/novosti_ekonomiki/', 'home', 2)% | ||
</pre> | </pre> | ||
− | 600 - время хранения | + | 600 - время хранения кэша; news - модуль; lastlist - метод модуля; далее параметры метода в стандартном порядке, как в |
[http://help-dev.umi-cms.ru/news.lastlist.html документации] | [http://help-dev.umi-cms.ru/news.lastlist.html документации] | ||
+ | [[Категория:Верстка в TPL]] | ||
+ | |||
+ | Работает в версиях до 2.8.5 включительно, в версиях 2.8.5.1 и выше уже не работает. |
Текущая версия на 11:34, 12 сентября 2012
В данной статье представлен пример кастомного 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 - метод модуля; далее параметры метода в стандартном порядке, как в документации
Работает в версиях до 2.8.5 включительно, в версиях 2.8.5.1 и выше уже не работает.