Гонки на скорость, часть вторая. Ускорение Modx Revo более чем в 8 раз
После этого поста мы получим мгновенный сайт для всех и очень быстрый для привилегированных. :-)
Вот вам заманушка из свежего эксперимента:
БЕЗ SMARTY, БЕЗ phpTemplates, сплошные ТЕГИ, ЧАНКИ, СНИППЕТЫ везде и всюду: ------> 0,6-4,8 sec (разброс большой), установлены getCache и CacheAccelerator.
СО SMARTY, с phpTemplates И БЕЗ ТЕГОВ (с парочкой чанков и с десятком сниппетов, мне лень просто их менять): ------> 0,36-0,45 sec (стабильно на статике и динамике)
СО SMARTY, с phpTemplates, БЕЗ ТЕГОВ (с парочкой чанков и с десятком сниппетов), А ТАКЖЕ С xFPC: ------> статика: 0,0 sec (засечь невозможно, почти html), серверные мониторы показывают 0,01 сек. ------> динамика стабильна: 0,34-0,39 sec
ОГОВОРКИ:
- PHP на сервере проверяем и настраиваем по этой ссылке: https://modxclub.ru/blog/research/175.html Что даёт серверную производительность даже на старом сайте, который был написан ламерами как я.
- Предполагается, что вы знаете или хотите узнать как работает phpTemplate и modxSmarty самостоятельно, изучая данный сайт, видео автора модулей и справку по Smarty.
Что имеем в начале:
- Боевой сайт. Железный сервер вытягивает любой хлам, но уже не всегда быстро как хотелось бы.
а) Тяжелая морда.
б) Всюду теги, чанки, вложенные чанки, линки в стиле
[[~[[*id]]]]в) Ламерская оптимизация, а точнее — никакой. г) Куча getPage, getResources с глубиной поиска до 10 каталогов, с where и с фильтрами, которые к тому же еще и сами чанки. д) Вообщем гамна набралось на всю ночь разбираться.
Что хотим?
- Сайт со скоростями HTML. В том числе и в динамике.
- Разгрузку сервера до состояния «пора покупать дешевый хостинг за 1$ в год».
Что делаем?
Делаем много, запаситесь временем, терпением и резервными копиями сайта-пациента. Кратко:
- Уберем нагрузку с обработки графики таким образом, чтобы она обрабатывалась в другом потоке.
- Уйдем от MODX-парсера максимально далеко.
- Научимся новым вещам и решениям.
- Закешируем всё так, что быстрее будет только HTML.
ПОЕХАЛИ
-
Ставим для обработки графики phpThumbsUp а) Открываем сниппет phpThumbOF(OF!!) и вставляем внутрь(!) его КОД сниппета phpThumbsUp. Убили много зайцев сразу и не надо ковырять сотню чанков. Минусы не стоят того, чтобы заботиться о них. б) в настройках системы находим phpThumbsUp и ставим так (делай как я):

в) Я также побыстрому избавился от RezImgCrop, сунув в его тело такой скрипт:
$serve = $modx->getOption('base_path');
$output = trim($input);
$opt = explode(',',$options);
if (count($opt) >= 1)
{
$crop = $opt[1];
$croparr = explode('x',trim($crop,'c-'));
$cropw = $croparr[0];
$croph = $croparr[1];
}
else
{
$crop = $opt[0];
$croparr = explode('x',trim($crop,'c-'));
$cropw = $croparr[0];
$croph = $croparr[1];
}
return ('/thumb/w/'.$cropw.'/h/'.$croph.'/zc/1/f/jpeg/q/94/src/'.$input); // дурная практика, знаю
- Ставим ModxSmarty и phpTemplates а) Разбираемся как это работает и пользуемся этим сайтом чтобы найти ответы. В том числе этот коммент. А также тут и тут.
- Сообразив по пункту 2 что нас ждёт жаркое время, приступаем к сайту: а) Создаем новый шаблон, назовем его, например main_new. б) Вбиваем в него примерно такое:
<?php
$output = $modx->smarty->fetch('header.tpl');
$output .= $modx->smarty->fetch('inside.tpl');
$output .= $modx->smarty->fetch('footer.tpl');
return $output;
?>
в) Сохраняем этот новый шаблон!
ЗАМЕТКА ПО ХОДУ: Я сделал шаблон статичным, как файл (изучайте справку по этим модулям), и положил его в /assets/templates/ с именем main.php
-
Теперь находим нашу главную страницу (ресурс) и копируем её с названием, например «Копия главной». а) Этой копии ставим тип ресурса «Документ с PHP-шаблоном» (проверено, так быстрее). Вот как тут:

б) Назначаем ей только что созданный шаблон main_new в) Ставим этой копии «Опубликовано» (пригодится ниже) г) Сохраняем копию документа.
ЗАМЕТКА ПО ХОДУ: Уже имеем шаблон + документ.
- Далее всё по инструкции по использованию Smarty, создаем шаблоны в каталоге /assets/templates/default (все подробности есть в документации по модулям), в нашем примере вот с такими именами:
$output = $modx->smarty->fetch('header.tpl');
$output .= $modx->smarty->fetch('inside.tpl');
$output .= $modx->smarty->fetch('footer.tpl');
- Теперь делаем так: а) Открываем СТАРЫЙ ШАБЛОН, который назначен главной странице боевого сайта. Б) Переносим этот MODX-format шаблон в… в блокнот! В) Создаем файлы шаблона smarty, как указано выше. Г) Копируя частями из блокнота, деля его на header (почти всегда одинаковый у всех страниц сайта), inside (тут динамика) и footer (тут тоже почти всегда статика), наполняем эти три вышеуказанных файла.
ЗАМЕТКА: Мы уже имеем файлы для будущего шаблона.
Д. КОНВЕРТИРУЕМ ручками старый MODX-format шаблон в SMARTY-формат (во всех трех файлах).
ВАЖНО: Будьте предельно внимательны, любая мелочь приведет к тому, что шаблон не заработает! Например:
{link id="55"}
выглядит правильно, но если он обрамлён еще в одни кавычки вот так:
a href="{link id="55"}"
то нифига не заработает. Поправьте такие детали, например так (разные кавычки):
a href='{link id="55"}'
Стоит заметить, что из равновесия может вывести даже такая штука:
a href='{link id="55" }'
Нашли тут ошибку? Если не нашли, то вас ждёт по-строковая проверка шаблонов, но это тоже полезно (я же так и прошел :-).
- Проверяем всё это упорно, пока у нас не отразится эта страница. Я применял как раз по-файлово-по-строчную проверку, где главным моим другом был… опять блокнот.
- Доводим всё это до результата. Шаг за шагом — это для нас, для ламеров, а умные профи могут сделать сразу.
- Получив таки первый приятный результат, подрубаем плагин xFPC и проверяем в настройках:

- Сбрасываем кеш сайта и запускаем браузер, в котором мы ТОЧНО разлогинены!
- Заходим на эту нашу страницу этим браузером и видим страницу.
- Перегружаем страницу, тыкнув F5.
- Фантастика, разве нет? Страница второй раз загрузится почти мгновенно.
- Жмем еще раз 20 F5, чтобы убедиться, что страница грузится мгновенно, ну или почти мгновенно.
- 13 пунктов нельзя, поэтому этим пунктом идём за пивом.
ВАЖНО ПОНЯТЬ: Для гостей будет отдаваться практически статичный html, что в большинстве случаев и требуется. Кроме того, никто не мешает применять Ajax и короткие интервалы кеширования плагина, а также любые другие подходы, включая серверные решения и даже cron.
ВАЖНО: Для залогиненного юзера скорость будет ниже, так как каждый раз будет выполняться шаблон на PHP, однако скорость его будет в разы быстрее и появится плавность работы. Также будет вся (относительно вся) динамика.
ПРИМЕЧАНИЕ:
Разумеется, что это грааль не само совершенство, однако это может превратить сайт из полного тупого тормоза в стремительную ракету, да так, что обзавидуются все.
Для гостей и ботов сайт пойдет почти как HTML.
Теперь повторение моих результатов (чтобы не пришлось мотать наверх):
БЕЗ SMARTY, БЕЗ phpTemplates, сплошные ТЕГИ, ЧАНКИ, СНИППЕТЫ везде и всюду: ------> 0,6-4,8 sec (разброс большой), установлены getCache и CacheAccelerator.
СО SMARTY, с phpTemplates И БЕЗ ТЕГОВ (с парочкой чанков и с десятком сниппетов, мне лень просто их менять): ------> 0,36-0,45 sec (стабильно на статике и динамике)
СО SMARTY, с phpTemplates, БЕЗ ТЕГОВ (с парочкой чанков и с десятком сниппетов), А ТАКЖЕ С xFPC: ------> статика: 0,0 sec (засечь невозможно, почти html), серверные мониторы показывают 0,01 сек. ------> динамика стабильна: 0,34-0,39 sec
PS. Вы можете поставить таймеры на PHP в шаблоне и замерить скорость работы страниц при работе, собственно PHP.