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

Обсуждение

geomagi, 2011/07/03 01:03

Спасибо ors за проделанную работу. У меня к Вам один вопрос,как сделать что бы при изменении языка модуль опознавал и заново кэшировал? Так работает отлично но при смене языка не происходит повторное кэширование. За ранее спасибо за ответ.

PrestaLab, 2011/07/07 11:55

Теоретически при смене языка должен меняться и кэш. Для этого используется параметр $smartyCacheId = 'editorial|'.$id_lang;

Дмитрий, 2011/08/24 00:57

Привет! можеш выложить переделанные файлы кэширования модуля категорий, новинок и товаров на главной

Серик, 2012/01/20 01:41

Прописал - сдох бобик, белый лист и ERROR

gabdr, 2012/04/01 17:06

у меня там уже куки прописано, как быть?

gabdr, 2012/04/01 17:39

у меня уже стоит с куки ,как быть? public function hookHome($params)

{
	global $cookie, $smarty;
	
	$editorial = new EditorialClass(1, (int)$cookie->id_lang);
	$smarty->assign(array(
		'editorial' => $editorial,
		'default_lang' => (int)$cookie->id_lang,
		'image_width' => Configuration::get('EDITORIAL_IMAGE_WIDTH'),
		'image_height' => Configuration::get('EDITORIAL_IMAGE_HEIGHT'),
		'id_lang' => $cookie->id_lang,
		'homepage_logo' => !Configuration::get('EDITORIAL_IMAGE_DISABLE') && file_exists('modules/editorial/homepage_logo.jpg'),
		'image_path' => $this->_path.'homepage_logo.jpg'
	));
	return $this->display(__FILE__, 'editorial.tpl');
}

public function hookHeader()
{
	Tools::addCSS(($this->_path).'editorial.css', 'all');
}

}

michel, 2012/09/21 13:16

Здравствуйте. стоит версия 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();

подскажите, как правильно его следует вставить?

Виктор, 2012/12/03 21:58

в 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)

как быть ?

Игорь, 2012/12/28 15:38

Разве вместо $display = $this→display(FILE, 'editorial.tpl'); не должно быть $display = $this→display(FILE, 'editorial.tpl', $smartyCacheId); ???

Ваш комментарий. вики-синтаксис разрешён:
EQQSO
 
kehshirovanie-modulej-v-ps-1.4.txt · Последние изменения: 2015/12/27 16:22 (внешнее изменение)