Разделы

  
 

Оптимизация Revolution

Ребят, пожалуйста, выложите кто-нибудь подробнейший гайд о том, как максимально уменьшить скорость загрузки страниц на сайте, который сделан на Revo.
Вроде того, что «эту строку в этом файле меняем на эту...» или «устанавливаем это расширение» и т.п.

Может кто-то когда-то круто разгонял Revolution?
Не поленитесь, поделитесь опытом.
Эта информация будет очень полезна всем!

Заранее спасибо!

Ускорение Wayfinder в Revolution (при большой структуре)

Делал сайт с верхним меню (js, выпадающее, содержит все страницы сайта) и боковым меню (отображает продукцию). Всего около 400 страниц с 6 уровнями иерархии.

Столкнулся с такой проблемой — даже со включенным кэшированием, Wayfinder постоянно перестраивает оба меню, в результате страница грузится около 2.68s при каждой загрузке.

Включение &cacheResults в вызове Wayfinder дало ускорение до 2.07s

Покопался в коде, понял следующее — при переходе со страницы на страницу Wayfinder заново выстраивает всю структуру и потом еще обрабатывает её, присваивая классы текущему пункту меню. Оптимизация hide sub menus описанная в инете не помогла: боковое меню стало работать быстрее, но оставалось еще верхнее меню, которое работало так же медленно.

Решил делать так: выстраивать меню целиком, сохранять его в кэше. Потом для бокового меню отдельно фильтровать скриптом и присваивать классы.

В итоге родился вот такой сниппет:


/*  Snippet WayfinderKSV 
 *  Author: Sergey Kravtsov
 *  Author email: sergey.kravtsov@jarstudio.com.ua 
*  Params: mode (to swich menu type)
*/

//Получаем текущий контекст, в принципе не обязательно, но у меня многосайтовая стуктура
$context=$modx->getOption('context_name')."_";

switch($mode) //В вызове сниппета будем указывать режим
{
case 'topmenu': //Верхнее меню
$key=$context.'wftopmenu'; //Название ключа кэша
$snippet='Wayfinder'; //Дальше идут параметры Wayfinder, без каких-то особенностей
$params=array(
   'startId' => 0,
   'outerTpl'=>'topMenuOuterTpl',
   'innerTpl'=>'topMenuInnerTpl',
   'rowTpl'=>'topMenuRowTpl',
   'level'=>4
);
break;


case 'production'://Боковое меню
$key=$context.'wfprodmenu';//Название ключа кэша
$snippet='Wayfinder'; //Дальше идут параметры Wayfinder
$params=array(
   'startId' => $modx->getOption('product_id'), 
   'hereClass'=>' ', //Здесь указываем пробелы, чтобы Wayfinder не добавлял классов
   'selfClass'=>' ', //Здесь указываем пробелы, чтобы Wayfinder не добавлял классов
   'rowTpl'=>'sideMenuRowTpl',
   'rowIdPrefix'=>'sm_', //Это нужно для фильтрации ниже
   'levelClass'=>'level_', //Это нужно для фильтрации ниже
   'outerClass'=>'prodmenu',
   'level'=>4
);
break;
}

$cached_wf = $modx->cacheManager->get($key); //Получаем сохраненную версию из кэша
if(!$cached_wf ) //Если не найдено
{
$wf= $modx->runSnippet($snippet,$params); //Запускаем Wayfinder
$cacheres=$modx->cacheManager->set($key,$wf,7200); //Кэшируем то что он выдаст
}
else $wf=$cached_wf; 


if($mode=='production' ) //Если боковое меню, фильтруем
{
 $id=$modx->resource->get('id');
 $parents=$modx->getParentIds($id); 
 $root_parents=array(0,$modx->getOption('product_id')); 
 $parents = array_diff($parents, $root_parents); 

 $find=array();
 $replace=array();

 $i=0;
 foreach($parents as $p){
   $find[$i]='id="sm_'.$p.'" class="';
   $replace[$i]=$find[$i].' current '; //Всем "родительских" узлов в меню ставим класс 'current'
   $i++;
   }
  $find[$i]='id="sm_'.$id.'" class="';
   $replace[$i]=$find[$i].' active  current '; //Текущему документу ставим 'active  current'

 
 $wf=str_replace($find,$replace,$wf);
}

echo $wf; 


Теперь с помощью CSS спрячем всё лишнее:


#sidemenu-box ul.prodmenu li.level_2,
#sidemenu-box ul.prodmenu li.level_3,
#sidemenu-box ul.prodmenu li.level_4,
#sidemenu-box ul.prodmenu li.level_5,
#sidemenu-box ul.prodmenu li.level_6{
	display:none;
}

#sidemenu-box ul.prodmenu li.current ul li.level_2,
#sidemenu-box ul.prodmenu li.current ul li.current ul li.level_3,
#sidemenu-box ul.prodmenu li.current ul li.current ul li.current ul li.level_3,
#sidemenu-box ul.prodmenu li.current ul li.current ul li.current ul li.current ul li.level_4,
#sidemenu-box ul.prodmenu li.current ul li.current ul li.current ul li.current ul li.current ul li.level_5{
	display:inherit;
}


Сам вызов сниппета такой:

[[WayfinderKSV? &mode=`production` ]]


Результаты работы такие (время загрузки страницы):
1. Без фильтрации (верхнее меню) — 707s
2. С фильтрацией (боковое меню) 1.2s

Исходное время 2.68s, то есть достигнуто ускорение минимум в 2 раза.

Метод, возможно, не самый красивый, но:

1. Удобный, т.к. не требует ломать чужие сниппеты
2. Может быть применен к любым другим сниппетам.

Оглавление главы "Увеличение производительности MODx"

Не так давно я просил помощи у участников сообщества в составлении списка актуальных вопросов по оптимизации работы сайтов на MODx. В целом ситуация находится на ладони и все основные вопросы так или иначе обсуждаются. В результате появилось следующее оглавление:

( Читать дальше )
  • +1
  • 7 июля 2010, 14:34
  • Carw
  • 2