Кэширование модулей в 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% по сравнению с использованием стандартного алгоритма.
Обсуждение
Спасибо ors за проделанную работу. У меня к Вам один вопрос,как сделать что бы при изменении языка модуль опознавал и заново кэшировал? Так работает отлично но при смене языка не происходит повторное кэширование. За ранее спасибо за ответ.
Теоретически при смене языка должен меняться и кэш. Для этого используется параметр $smartyCacheId = 'editorial|'.$id_lang;
Привет! можеш выложить переделанные файлы кэширования модуля категорий, новинок и товаров на главной
Прописал - сдох бобик, белый лист и ERROR
у меня там уже куки прописано, как быть?
у меня уже стоит с куки ,как быть? public function hookHome($params)
}
Здравствуйте. стоит версия 1.4.8.3 заменяю код функции public function hookHome($params) на приведенный выше, но после внесения последних строк кода сайт вырубается
/ Delete logo image if (Tools::isSubmit('deleteImage')) { $this→_clearEditorialCache(); /* update the editorial xml */ if (Tools::isSubmit('submitUpdate')) { $this→_clearEditorialCache();
подскажите, как правильно его следует вставить?
в BO ошибка The following module(s) couldn't be loaded:
editorial (parse error in /modules/editorial/editorial.php) editorial (class missing in /modules/editorial/editorial.php)
как быть ?
Разве вместо $display = $this→display(FILE, 'editorial.tpl'); не должно быть $display = $this→display(FILE, 'editorial.tpl', $smartyCacheId); ???