Кэширование модулей в 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% по сравнению с использованием стандартного алгоритма.

kehshirovanie-modulej-v-ps-1.4.txt · Последние изменения: 2015/12/27 16:22 (внешнее изменение)