doggy00@inbox.ru
6 авг. 2013 г., 4:05

Гонки на скорость, часть вторая. Ускорение Modx Revo более чем в 8 раз

http://modxclub.ru/uploads/images/00/01/66/2013/08/06/75d4c5.jpg
После этого поста мы получим мгновенный сайт для всех и очень быстрый для привилегированных. :-) Вот вам заманушка из свежего эксперимента:
1. БЕЗ SMARTY, БЕЗ phpTemplates, сплошные ТЕГИ, ЧАНКИ, СНИППЕТЫ везде и всюду: ------> 0,6-4,8 sec (разброс большой), установлены getCache и CacheAccelerator. 2. СО SMARTY, с phpTemplates И БЕЗ ТЕГОВ (с парочкой чанков и с десятком сниппетов, мне лень просто их менять): ------> 0,36-0,45 sec (стабильно на статике и динамике) 3. СО SMARTY, с phpTemplates, БЕЗ ТЕГОВ (с парочкой чанков и с десятком сниппетов), А ТАКЖЕ С xFPC: ------> статика: 0,0 sec (засечь невозможно, почти html), серверные мониторы показывают 0,01 сек. ------> динамика стабильна: 0,34-0,39 sec

ОГОВОРКИ:

1. PHP на сервере проверяем и настраиваем по этой ссылке: https://modxclub.ru/blog/research/175.html Что даёт серверную производительность даже на старом сайте, который был написан ламерами как я. 2. Предполагается, что вы знаете или хотите узнать как работает phpTemplate и modxSmarty самостоятельно, изучая данный сайт, видео автора модулей и справку по Smarty.

Что имеем в начале:

1. Боевой сайт. Железный сервер вытягивает любой хлам, но уже не всегда быстро как хотелось бы. а) Тяжелая морда. б) Всюду теги, чанки, вложенные чанки, линки в стиле [[~[[*id]]]] в) Ламерская оптимизация, а точнее — никакой. г) Куча getPage, getResources с глубиной поиска до 10 каталогов, с where и с фильтрами, которые к тому же еще и сами чанки. д) Вообщем гамна набралось на всю ночь разбираться.

Что хотим?

1. Сайт со скоростями HTML. В том числе и в динамике. 2. Разгрузку сервера до состояния «пора покупать дешевый хостинг за 1$ в год».

Что делаем?

Делаем много, запаситесь временем, терпением и резервными копиями сайта-пациента.
Кратко: 1. Уберем нагрузку с обработки графики таким образом, чтобы она обрабатывалась в другом потоке. 2. Уйдем от MODX-парсера максимально далеко. 3. Научимся новым вещам и решениям. 4. Закешируем всё так, что быстрее будет только HTML.

ПОЕХАЛИ

1. Ставим для обработки графики phpThumbsUp      а) Открываем сниппет phpThumbOF(OF!!) и вставляем внутрь(!) его КОД сниппета phpThumbsUp. Убили много зайцев сразу и не надо ковырять сотню чанков. Минусы не стоят того, чтобы заботиться о них.      б) в настройках системы находим phpThumbsUp и ставим так (делай как я):
http://modxclub.ru/uploads/images/00/01/66/2013/08/06/51cab6.jpg
     в) Я также побыстрому избавился от 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); // дурная практика, знаю
2. Ставим ModxSmarty и phpTemplates      а) Разбираемся как это работает и пользуемся этим сайтом чтобы найти ответы. В том числе этот коммент. А также тут и тут.
3. Сообразив по пункту 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
4. Теперь находим нашу главную страницу (ресурс) и копируем её с названием, например «Копия главной».      а) Этой копии ставим тип ресурса «Документ с PHP-шаблоном» (проверено, так быстрее). Вот как тут: http://modxclub.ru/uploads/images/00/01/66/2013/08/06/0aa620.jpg
     б) Назначаем ей только что созданный шаблон main_new      в) Ставим этой копии «Опубликовано» (пригодится ниже)      г) Сохраняем копию документа.
ЗАМЕТКА ПО ХОДУ: Уже имеем шаблон + документ.
4. Далее всё по инструкции по использованию Smarty, создаем шаблоны в каталоге /assets/templates/default (все подробности есть в документации по модулям), в нашем примере вот с такими именами:
$output = $modx->smarty->fetch('header.tpl'); $output .= $modx->smarty->fetch('inside.tpl'); $output .= $modx->smarty->fetch('footer.tpl');
5. Теперь делаем так: а) Открываем СТАРЫЙ ШАБЛОН, который назначен главной странице боевого сайта. Б) Переносим этот 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" }'
Нашли тут ошибку? Если не нашли, то вас ждёт по-строковая проверка шаблонов, но это тоже полезно (я же так и прошел :-).
6. Проверяем всё это упорно, пока у нас не отразится эта страница. Я применял как раз по-файлово-по-строчную проверку, где главным моим другом был… опять блокнот.
7. Доводим всё это до результата. Шаг за шагом — это для нас, для ламеров, а умные профи могут сделать сразу.
8. Получив таки первый приятный результат, подрубаем плагин xFPC и проверяем в настройках:
http://modxclub.ru/uploads/images/00/01/66/2013/08/06/ba582e.jpg
9. Сбрасываем кеш сайта и запускаем браузер, в котором мы ТОЧНО разлогинены!
10. Заходим на эту нашу страницу этим браузером и видим страницу.
11. Перегружаем страницу, тыкнув F5.
12. Фантастика, разве нет? Страница второй раз загрузится почти мгновенно.
13. Жмем еще раз 20 F5, чтобы убедиться, что страница грузится мгновенно, ну или почти мгновенно.
14. 13 пунктов нельзя, поэтому этим пунктом идём за пивом.
ВАЖНО ПОНЯТЬ: Для гостей будет отдаваться практически статичный html, что в большинстве случаев и требуется. Кроме того, никто не мешает применять Ajax и короткие интервалы кеширования плагина, а также любые другие подходы, включая серверные решения и даже cron.
ВАЖНО: Для залогиненного юзера скорость будет ниже, так как каждый раз будет выполняться шаблон на PHP, однако скорость его будет в разы быстрее и появится плавность работы. Также будет вся (относительно вся) динамика.
ПРИМЕЧАНИЕ: Разумеется, что это грааль не само совершенство, однако это может превратить сайт из полного тупого тормоза в стремительную ракету, да так, что обзавидуются все.
Для гостей и ботов сайт пойдет почти как HTML.
Теперь повторение моих результатов (чтобы не пришлось мотать наверх):
1. БЕЗ SMARTY, БЕЗ phpTemplates, сплошные ТЕГИ, ЧАНКИ, СНИППЕТЫ везде и всюду: ------> 0,6-4,8 sec (разброс большой), установлены getCache и CacheAccelerator. 2. СО SMARTY, с phpTemplates И БЕЗ ТЕГОВ (с парочкой чанков и с десятком сниппетов, мне лень просто их менять): ------> 0,36-0,45 sec (стабильно на статике и динамике) 3. СО SMARTY, с phpTemplates, БЕЗ ТЕГОВ (с парочкой чанков и с десятком сниппетов), А ТАКЖЕ С xFPC: ------> статика: 0,0 sec (засечь невозможно, почти html), серверные мониторы показывают 0,01 сек. ------> динамика стабильна: 0,34-0,39 sec
PS. Вы можете поставить таймеры на PHP в шаблоне и замерить скорость работы страниц при работе, собственно PHP.

ВАЖНО ЗНАТЬ, что с xFPC для гостей PHP В ШАБЛОНЕ НЕ БУДЕТ РАБОТАТЬ.

Попутно скажу, что для измерения скорости открытия сайта не следует учитывать пинги, хопы и ширину канала и/или работающие фоновые торренты.
Для ускорения отклика сайта и уменьшения пинга надо применять другие решения.
Проверка же вышеизложенного решения, даже с учетом сетевых задержек по территории Европы, приведена ниже:
Resolve time: 27 ms Connect time: 19 ms Download time: 206 ms Resolve time: 19 ms Connect time: 9 ms Download time: 67 ms Resolve time: 297 ms Connect time: 15 ms Download time: 73 ms Resolve time: 40 ms Connect time: 21 ms Download time: 102 ms
Ссылка, если тоже хотите тут потестить.
А также вот еще:
Средняя скорость 0.43 sec с 26 точек планеты.
Секретная ссылка на службу мониторинга.
У меня вопрос поводу phpThumbsUp: у MODX появился еще пакет pThumb. Какой все-таки лучше ставить?
Блин, пока пишу основной обстоятельный коммент, попутно ковыряю xFPC. Чел жгет :-)
if ((int) $combineJsAndCss == 1) { $combineJsAndCss = true; } else { $combineJsAndCss = false; }
Только сегодня видел картинку «оптимизацией тут и не пахнет»)))
Вот здесь подробный обзор: blog.agel-nash.ru/2013/8/thumb.html Автор советует по многим причинам именно pThumb ставить. Кстати, он заменяет сниппет phpthumbof, так что на сайте даже сниппеты перебивать не придется.
Кстати, реальная его польза в плане кеша у меня вызывает кучу сомнений, но зато в нем есть минификатор CSS и JS, то есть как раз то, о чем я недавно спрашивал. На досуге покопаю. Спасибо за наводку!
Итак, дописал основной коммент :-)
Спасибо за собирательный топик! А я дам несколько комментариев-уточнений.
а) Открываем сниппет phpThumbOF(OF!!) и вставляем внутрь(!) его КОД сниппета phpThumbsUp. Убили много зайцев сразу и не надо ковырять сотню чанков. Минусы не стоят того, чтобы заботиться о них.
Я бы вот так не стал делать. В среднестатистическом сайте не так много вызовов этого сниппета по шаблонам и чанкам, чтобы убивать обновления и т.п. Хотя если посмотреть на то, как pThumb устанавливает с обновлением сниппет phpthumbof, то тут уже многое становится не однозначным.
<?php $output = $modx->smarty->fetch('header.tpl'); $output .= $modx->smarty->fetch('inside.tpl'); $output .= $modx->smarty->fetch('footer.tpl'); return $output;
Я бы все-таки не стал вызывать 3 шаблона таким образом, а сделал бы один общий шаблон, и при необходимости сделал в нем инклюды {include file=«header.tpl»} и т.п., тем более что в таком случае можно использовать локальное кеширование подшаблона, а в случае с приведенным примером этого сделать нельзя (если только не включено глобальное кеширование Smarty).
а) Этой копии ставим тип ресурса «Документ с PHP-шаблоном» (проверено, так быстрее).
Вот это утверждение очень сомнительное. Я оставил CRC phpTemplateResource так, на всякий случай (так сказать, остался в наследство). Но в силу особенностей его развития, он в итоге деградировал и оказался менее функциональным, чем его предок. Дело в том, что в нем исключено кеширование шаблона. То есть при любом раскладе его шаблон будет вызываться и выполняться, в то время, как нативный класс не выполняет шаблон, если он закеширован уже и у него не стоит phptemplates.non-cached=true. Так что родной класс, если уже отработан и закеширован, а методе process() сразу вернет конечный код, а phpTemplateResource в любом случае выполнит шаблон, и это никак не может быть быстрее. К тому же, как практика показала, создавать именно «Документ с php-шаблоном», а не просто документ — бонально неудобно.
Например: {link id="55"} выглядит правильно, но если он обрамлён еще в одни кавычки вот так: a href="{link id="55"}" то нифига не заработает.
Неверное утверждение. Смарти парсит все внутри фигурных скобок, и ему пофиг что за пределами этих скобок. Он спарсит {link id=«55»} и заменит на его значение, и все будет ОК. К слову, если пробелов нет, то можно вообще без ковычек, к примеру {link id=55}. Вот еще пример того, как можно вызывать вместе с ковычками:
<img src="{snippet name="phpthumbof" params="input=`{$object.image}`&options=`h=130&w=200`"}" />
И с этим нет никаких проблем. Резюме: конечно, ошибок вижу много. Но не это главное! Главное то, что ты смог значительно ускорить свой сайт. И быть может далеко не всем поможет этот топик (то есть не будет исчерпывающим руководством), но он точно будет примером того, что при желании можно ускорить свой Рево-сайт очень значительно. Спасибо!
Спасибо за отзыв и информацию.
Подскажите как решить такую проблему: У меня большой сайт ( более 1000 документов) Каждый раз когда создается кэш ресурса в папке [n]-ресурса создаются несколько файлов кэша и один из них карта всех ресурсов. Весит такой файл больше мегабайта. И что самое страшное такой файл есть в каждой папке каждого кэша ресурса. Как избавится от создания этих файлов?
..../core/cache/resource/web/resources/1017/de9523cb70751d473bd60d3cd20ae084.cache.php
<?php if(time() > 1433328958){return null;} return array ( 1 => array ( 8 => array ( 0 => array ( 'id' => 9, 'type' => 'document', 'contentType' => 'text/html', 'pagetitle' => '....', 'longtitle' => '......', 'description' => '', 'alias' => 'davlenie', 'link_attributes' => '', 'published' => true, ...
Это Wayfinder создает, 99%. Передавайте в вызов вейфайндера &cacheResults=`0`
Огромное спасибо! Перестали создаваться файлы и даже папки с номером ресурса. Только вот еще один вопрос.
Т.е. сайт очень большой формирование кэша занимает очень много времени от 6 до 9 секунд. Это очень много при первом открытии незакэшированной страницы. Я так понимаю это тоже WayFinder делает. А у меня их в шаблоне аж 3 штуки. Какие есть альтернативы? Или если это что-то другое, то что? И как исправить ситуацию?
Всё! Разобрался. Это действительно был вейфиндер в многоуровневом меню. Буду менять конструкцию
Т.е. сайт очень большой формирование кэша занимает очень много времени от 6 до 9 секунд.
Как минимум отключите кеширование карты ресурсов. Время генерации кеша не особенно снизится, но сам кеш контекста процентов на 50-70% уменьшится. Это системная настройка cache_alias_map.
Д. КОНВЕРТИРУЕМ ручками старый MODX-format шаблон в SMARTY-формат (во всех трех файлах).
Вопрос: где глянуть синтаксис для конвертации? Например, мне нужно конвертировать tv [[*meta_description]] в SMARTY-формат. Как это будет выглядеть в SMARTY-формате?
Спасибо! Но, есть ли что-то для совсем ламеров? Эту страничку очень долго рыть придется, что-бы найти, как перевести чанки или tv SMARTY-формат…
есть немало примеров (в т.ч. видео) на этом сайте. shopmodxbox весь построен на этой технологии. Но на самом деле modxsmarty нормально понимает синтаксис modx шаблонов, т.е. можно просто их скопировать, а потом потихоньку добавлять вкусности smarti.
Ну приведите пример вкусностей, пожалуйста, чтобы я понял…
Спасибо! Буду разбираться…
При переносе шаблона в SMARTY выявил проблему. До переноса в шаблон была встроена партнерская ссылка, которая скрывалась от поисковиков через Jquery. До переноса код выглядел так:
<head> <title>[[*meta_title]]</title> <meta name="description" content="[[*meta_description]]"/> <meta name="keywords" content="[[*meta_keywords]]"/> ............................ <base href="[[++site_url]]" /> </head> <body> ...... <button class="single_add_to_cart_button button alt"> <span class="hlink" data-link="[[*hlink]]">Заказать</span></button> ......
После переноса получаю ошибку: Fatal error: Uncaught --> Smarty Compiler: Syntax error in template "/home/s2109/www/core/components/modxsite/templates/default/tpl/tovar.tpl" on line 82 "" — Unexpected "'<a target="_blank" rel=«nofollow» title=«Перейти на сайт партнера» href="'", expected one of: "}" < — thrown in /home/s2109/www/core/components/modxsmarty/external/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php on line 82
Если выношу скрипт в отдельный чанк, ошибка пропадает, но ссылка только на главную действующего сайта (не партнерского). Сама партнерская ссылка заносится в помощью TV hlink.
Может кто-нибудь знает альтернативный способ скрыть ссылку от поисковиков в SMARTY?
В предыдущем комменте удалились ссылки, поэтому выкладываю скрины:
Head до изменения шаблона — yadi.sk/i/3_-JiHRlhHdJg Кнопка заказа — yadi.sk/i/Ks_UtVa_hHdP7
Head после изменения шаблона — yadi.sk/i/1-n4NMjQhHdod Кнопка заказа после изменения шаблона — yadi.sk/i/qIWmgdxmhHdZm Ошибка — yadi.sk/i/92XhwukehHdBR
Вы ошибки читайте. Сами же процитировали. Ругается на фигурную скобку { в коде. Smarty-теги оборачиваются в фигурные скобки. Поместите код в блок {literal}...{/literal}.
До переноса в шаблон была встроена партнерская ссылка, которая скрывалась от поисковиков через Jquery.
Ссылка, которая скрывается жучкой?.. Ну-ну. Или это ссылка, которая создается жучкой, или ничто не скрывается. Да даже если жучкой создается, много раз уже говорилось, что тот же гугл давно уже обрабатывает javascript.
Если выношу скрипт в отдельный чанк, ошибка пропадает, но ссылка только на главную действующего сайта (не партнерского).
Это уже вопрос не к Смарти.
А чем скрывать? Такие ссылки нужны…
Это я вам не скажу. Зависит от конкретной задачи. Но в большинстве случаев все, что так или иначе появляется на стороне браузера, доступно и поисковикам. Они совсем не тупые.
За {literal} спасибо! Упустил… Проблема решена…
Пожалуйста. И читайте доку и гугл спрашивайте чаще. На это 100500 ответов в сети.
Статья на тему «как превратить MODx в вордпресс» ))
Сломалась ссылка на конфигурирование и проверку PHP http://modxclub.ru/blog/sandbox/175.html :( Как бы её найти теперь?

Да, супер! Спасибо за быстрый ответ. Жаль, что время PHP5 давно ушло :( Может быть у вас есть что-нибудь на примете более актуальное, для 7 версии ?
А это не моя статья. Сам я на php-7.1 получаю 0.07 сек и это меня вполне устраивает.
0,07 – это шикарный результат. А можете вкратце поделиться рецептом настройки PHP именно в серверной части?
Никакой настройки (связка nginx+php-fmp без какого-либо тюнинга). Оптимизация самого сайта. Про это я много статей писал.
Понял, спасибо! Тогда буду потихоньку все переписывать. Надеялся на временное решение в виде какого-нибудь memcached
Подскажите, имеем на сайте штук 20 youtube-видео плиткой и они очень долго прогружаются. Сайт на MODX, что делать?
Большая задержка перед отдачей страницы с сервера, после чего после чего появляются ютуб-ролики? Или все же страница быстро появляется, а вот ютуб-ролики потом долго подгружаются? Думаю, скорее всего второе, и тут к MODX вопросов никаких не должно быть, это же с ютуба ролики подгружаются, а не с MODX. Делайте так, чтобы в превьюхах к роликам картинки выводились, а не сами ролики, а по клику уже ролик, быстрее будет выглядеть. На сколько знаю, Саша Марков такое делал, придет, расскажет как.
К вопросу о Ютубе, подгружайте ролики асинхронно, либо через ссылку

Сделал по инструкции шаблон main с статическим файлом assets/templates/main.php
Создаю страницу, прикручиваю шаблон, делаю Тип ресурса с php форматом
Создаю в папке assets/templates/default - 3 файла формата *.tpl - для теста прописываю там простой текст текст
перехожу на страницу и выбивает сходу ошибку 500
не могу понять на каком этапе допустил ошибку, сделал вроде всё правильно.
Кэш чистил, права проверил..
1. Где-то я писал, что лишние манипуляции с .php больше не требуются. Создаете обычный шаблон и в любом месте прописываете [[!smarty?tpl=`foo.tpl`]]
2. В core/config/config.inc.php можете прописать
ini_set('display_startup_errors', 1); error_reporting(E_ALL ^E_NOTICE);
должно помочь с тем, чтобы сообщения об ошибках выводились на саму страницу.
3. Попробуйте сначала развернуть отдельно ShopModxBox. Там все на смарти, изучите там как в общих чертах все работает, а после уже на своем сайте делайте.
Даже при выводе [[!smarty?tpl=`foo.tpl`]] всё равно выдает 500
Смотрите пп 2 и 3.
У вас шаблон foo.tpl имеется? Скорее всего нет, и соответственно возникает критическая ошибка. Но так как вы не указываете вывод ошибок на странице, то они у вас улетают в лог. Ищите логи и в них конкретную ошибку, или выводите логи на страницу. Экстрасенсы на самоизоляции.
Имеется другой шаблон tpl
в логах ничего нет, что у modx что на сервере
Вот попробуйте прописать другой шаблон.
А лучше, еще раз повторюсь, попытайтесь развернуть ShopModxBox и посмотреть там как все работает.
умеет кэшировать сессионные ключи от компонентов и прогревать кэш через wget

Добавить комментарий