den99 06 августа 2013 8 20


После этого поста мы получим мгновенный сайт для всех и очень быстрый для привилегированных. :-)
Вот вам заманушка из свежего эксперимента:

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 на сервере проверяем и настраиваем по этой ссылке, в части первой. Что даёт серверную производительность даже на старом сайте, который был написан ламерами как я.
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 и ставим так (делай как я):



     в) Я также побыстрому избавился от 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-шаблоном» (проверено, так быстрее).
Вот как тут:


     б) Назначаем ей только что созданный шаблон 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 и проверяем в настройках:



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 В ШАБЛОНЕ НЕ БУДЕТ РАБОТАТЬ.

20 комментариев
den991
den99 06 августа 2013г в 08:52 #
-1
Попутно скажу, что для измерения скорости открытия сайта не следует учитывать пинги, хопы и ширину канала и/или работающие фоновые торренты.

Для ускорения отклика сайта и уменьшения пинга надо применять другие решения.

Проверка же вышеизложенного решения, даже с учетом сетевых задержек по территории Европы, приведена ниже:

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 точек планеты.
Секретная ссылка на службу мониторинга.
Tramp13571
Tramp1357 06 августа 2013г в 21:49 #
У меня вопрос поводу phpThumbsUp: у MODX появился еще пакет pThumb. Какой все-таки лучше ставить?
Fi1osof1
Fi1osof 06 августа 2013г в 23:15 #
Вот здесь подробный обзор: blog.agel-nash.ru/2013/8/thumb.html
Автор советует по многим причинам именно pThumb ставить. Кстати, он заменяет сниппет phpthumbof, так что на сайте даже сниппеты перебивать не придется.
Fi1osof1
Fi1osof 06 августа 2013г в 23:13 #
Блин, пока пишу основной обстоятельный коммент, попутно ковыряю xFPC. Чел жгет :-)
if ((int) $combineJsAndCss == 1) {
	$combineJsAndCss = true;
} else {
	$combineJsAndCss = false;
}

Только сегодня видел картинку «оптимизацией тут и не пахнет»)))
Fi1osof1
Fi1osof 06 августа 2013г в 23:18 #
Кстати, реальная его польза в плане кеша у меня вызывает кучу сомнений, но зато в нем есть минификатор CSS и JS, то есть как раз то, о чем я недавно спрашивал. На досуге покопаю. Спасибо за наводку!
Fi1osof1
Fi1osof 06 августа 2013г в 23:25 #
Итак, дописал основной коммент :-)

Спасибо за собирательный топик!
А я дам несколько комментариев-уточнений.
а) Открываем сниппет 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`"}" />

И с этим нет никаких проблем.
Резюме: конечно, ошибок вижу много. Но не это главное! Главное то, что ты смог значительно ускорить свой сайт. И быть может далеко не всем поможет этот топик (то есть не будет исчерпывающим руководством), но он точно будет примером того, что при желании можно ускорить свой Рево-сайт очень значительно. Спасибо!
den991
den99 06 августа 2013г в 23:53 #
Спасибо за отзыв и информацию.
e
elezeo 04 июня 2015г в 10:00 #
Подскажите как решить такую проблему:
У меня большой сайт ( более 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,
...

Fi1osof1
Fi1osof 04 июня 2015г в 17:46 #
Это Wayfinder создает, 99%. Передавайте в вызов вейфайндера &cacheResults=`0`
e
elezeo 07 июня 2015г в 09:28 #
Огромное спасибо! Перестали создаваться файлы и даже папки с номером ресурса.
Только вот еще один вопрос.

Т.е. сайт очень большой формирование кэша занимает очень много времени от 6 до 9 секунд. Это очень много при первом открытии незакэшированной страницы. Я так понимаю это тоже WayFinder делает. А у меня их в шаблоне аж 3 штуки. Какие есть альтернативы?
Или если это что-то другое, то что? И как исправить ситуацию?
Fi1osof1
Fi1osof 08 июня 2015г в 19:55 #
Т.е. сайт очень большой формирование кэша занимает очень много времени от 6 до 9 секунд.
Как минимум отключите кеширование карты ресурсов. Время генерации кеша не особенно снизится, но сам кеш контекста процентов на 50-70% уменьшится. Это системная настройка cache_alias_map.
e
elezeo 07 июня 2015г в 10:19 #
Всё! Разобрался. Это действительно был вейфиндер в многоуровневом меню. Буду менять конструкцию
a
almaks 12 июня 2015г в 22:12 #
Д. КОНВЕРТИРУЕМ ручками старый MODX-format шаблон в SMARTY-формат (во всех трех файлах).

Вопрос: где глянуть синтаксис для конвертации? Например, мне нужно конвертировать tv [[*meta_description]] в SMARTY-формат. Как это будет выглядеть в SMARTY-формате?
Tramp13571
Tramp1357 13 июня 2015г в 00:03 #
a
almaks 13 июня 2015г в 07:29 #
Спасибо! Но, есть ли что-то для совсем ламеров? Эту страничку очень долго рыть придется, что-бы найти, как перевести чанки или tv SMARTY-формат…
Tramp13571
Tramp1357 13 июня 2015г в 09:44 #
есть немало примеров (в т.ч. видео) на этом сайте. shopmodxbox весь построен на этой технологии.
Но на самом деле modxsmarty нормально понимает синтаксис modx шаблонов, т.е. можно просто их скопировать, а потом потихоньку добавлять вкусности smarti.
a
almaks 13 июня 2015г в 09:50 #
Ну приведите пример вкусностей, пожалуйста, чтобы я понял…
a
almaks 13 июня 2015г в 10:29 #
Спасибо! Буду разбираться…
a
almaks 16 июня 2015г в 18:40 #
При переносе шаблона в 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?
Fi1osof1
Fi1osof 16 июня 2015г в 19:00 #
Вы ошибки читайте. Сами же процитировали. Ругается на фигурную скобку { в коде. Smarty-теги оборачиваются в фигурные скобки. Поместите код в блок {literal}...{/literal}.

До переноса в шаблон была встроена партнерская ссылка, которая скрывалась от поисковиков через Jquery.
Ссылка, которая скрывается жучкой?.. Ну-ну. Или это ссылка, которая создается жучкой, или ничто не скрывается. Да даже если жучкой создается, много раз уже говорилось, что тот же гугл давно уже обрабатывает javascript.
a
almaks 16 июня 2015г в 19:05 #
А чем скрывать? Такие ссылки нужны…
Fi1osof1
Fi1osof 16 июня 2015г в 19:11 #
Это я вам не скажу. Зависит от конкретной задачи. Но в большинстве случаев все, что так или иначе появляется на стороне браузера, доступно и поисковикам. Они совсем не тупые.
a
almaks 16 июня 2015г в 19:32 #
За {literal} спасибо! Упустил… Проблема решена…
Fi1osof1
Fi1osof 16 июня 2015г в 20:02 #
Пожалуйста. И читайте доку и гугл спрашивайте чаще. На это 100500 ответов в сети.
Fi1osof1
Fi1osof 16 июня 2015г в 19:00 #
Если выношу скрипт в отдельный чанк, ошибка пропадает, но ссылка только на главную действующего сайта (не партнерского).
Это уже вопрос не к Смарти.
a
almaks 16 июня 2015г в 18:52 #
В предыдущем комменте удалились ссылки, поэтому выкладываю скрины:

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
H
Hakujin 21 марта 2016г в 14:41 #
Статья на тему «как превратить MODx в вордпресс» ))
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.