Ускорение UMI-CMS за счет блочного кеширования в tpl
Долго бился с производительностью одного из сайтов на UMI-CMS, но никак не мог побороть. Генерация страницы была все время в районе 2-3 сек, а иногда и более и это на VPS. Даже поставил Ubuntu и перенес туда сайт, что бы локально ускорить его до максимума, но пока с помощью настройки сервера удалось только снизить генерацию страницы до 1 сек, но хочеться, что бы еще быстрее генерировалась (попытки настроить Ubuntu не прекращаю). И тут наткнулся на статью: http://wiki.umisoft.ru/%D0%91%D0%BB%D0%B
E%D1%87%D0%BD%D0%BE%D0%B5_%D0%BA%D1%8D%D1%88%D0%B8%D1%80%
D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_html-%D0%BA%D0%BE%D0%B4%D0%B0_%D0%B2_TPL, где расписывается, как можно закешировать отдельные блоки tpl шаблонизатора.
Необходимо в файл 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; } |
В данном коде сделал маленькое изменение, заменив строку $folder = CURRENT_WORKING_DIR . ‘/sys-temp/tplcache/’; на $folder = CURRENT_WORKING_DIR . ‘/sys-temp/tplcache/’. $_SERVER[‘REQUEST_URI’]; , что дало возможность хранить закешированные блоки по структуре сайта, т.е. если пользователь зашел в site.ru/folder/, то кеш сохраниться в папке /sys-temp/tplcache/folder/, а если просто site.ru, то в /sys-temp/tplcache/. Т.е. если необходимо удалить кеш какой либо страницы, то найти ее не составит труда.
Что бы функция заработала надо в шаблоне прописать: %custom tplcache(600, ‘catalog’, ‘viewObject’, %id%, ‘default’)%, что равно макросу %catalog viewObject(%id%, ‘default’)% и где 600 — это время хранения кеша. А так же необходимо отключить любое кеширование в админке UMI.
Благодаря проделанным изменениям все страницы начали генерироваться от 0,18 сек до 0,8 сек, что вполне достойно уже.
[…] на основе экспорта в YML, но позже повстречался скрипт, описанный в прошлой статье , и было принято решение сделать шаблон на tpl и […]