Кэширование модулей в PrestaShop 1.4
Кэширование модулей в PrestaShop 1.4
В версии 1.4 добавлено кэширование Smarty на уровне ядра. Однако кэшируется всего один модуль - blockcategories. Причем количество экземпляров кэширования довольно велико: id_group*id_lang*id_product*id_category. То есть минимальное количество равно количеству товаров в магазине. Для большинства блоков размер кэша будет значительно меньше.
Добавление кэширования к модулю editorial
Открываем modules/editorial/editorial.php и правим функцию hookHome
public function hookHome($params) { global $smarty; //Создаем идентификатор кэша //В данном случае отображение модуля зависит только от языка пользователя $id_lang = (int)($params['cookie']->id_lang); $smartyCacheId = 'editorial|'.$id_lang; //Включаем кэширование. Фактически вызывает $smarty->caching = true; Tools::enableCache(); //Проверяем закэширован ли уже блок if (!$this->isCached('editorial.tpl', $smartyCacheId)) { //Если не кэширован, то получаем данные и отображаем блок. //Ид языка уже получен, поэтому нет смысла получать его еще раз $editorial = new EditorialClass(1, $id_lang); $smarty->assign(array( 'editorial' => $editorial, 'default_lang' => $id_lang, 'image_width' => Configuration::get('EDITORIAL_IMAGE_WIDTH'), 'image_height' => Configuration::get('EDITORIAL_IMAGE_HEIGHT'), 'id_lang' => $id_lang, 'homepage_logo' => file_exists('modules/editorial/homepage_logo.jpg'), 'image_path' => $this->_path.'homepage_logo.jpg' )); } //Устанавливаем время жизни кэша $smarty->cache_lifetime = 31536000; // 1 год //Результат не возвращаем, как было раньше, а сохраняем в переменной. //Если в кэша не было, то он будет создан, иначе результат берется сразу из кэша $display = $this->display(__FILE__, 'editorial.tpl'); //Восстанавливаем настройки кэширования. Вызывает $smarty->caching = false; Tools::restoreCacheSettings(); //Возвращаем результат return $display; }
В принципе уже сейчас можно использовать исправленный модуль. Но тогда при каждом изменении придется вручную очищать кэш. Поэтому добавим функцию автоматической очистки.
private function _clearEditorialCache() { $this->_clearCache('editorial.tpl'); Tools::restoreCacheSettings(); }
Вызываем эту функцию при удалении картинок и изменении текста:
// Delete logo image if (Tools::isSubmit('deleteImage')) { $this->_clearEditorialCache();
/* update the editorial xml */ if (Tools::isSubmit('submitUpdate')) { $this->_clearEditorialCache();
Использование кэширования значительно снижает нагрузку на сервере и ускоряет генерацию страниц. Однако создание экземпляра кэша занимает некоторое время, поэтому кэширование часто изменяющихся блоков не только не снизит нагрузку на сервер, но и может увеличить время генерации страницы.
На главной странице http://prestalab.ru/ кэшированы модули категорий, новостей, новинок, товаров на главной, ссылки в футере и блок тегов. Тестирование утилитой ab показало снижение времени генерации страницы на 30%. Кстати после этого применение модифицированная минификации кода дала ускорение еще 35% по сравнению с использованием стандартного алгоритма.