На modxcms.com пользователь tobice столкнулся с проблемой чрезмерно большого количества обращений к БД.
В результате выяснилось, что в плагине PHx содержится досадная ошибка, которая приводит к 1 дополнительному запросу к БД при
каждом вызове phx-сниппета. К примеру, если вы используете Дитто, то вы получите по N дополнительных запросов на каждую итерацию (в случае некешируемого вызова)!
Исходный топик:
110 mysql requests for one page loaded from cache! Is it too much?!
Решение:
PHx не использует штатный метод MODx API modx->runSnippet(), и как следствие, не использует кеш MODx для хранения кодов своих сниппетов.
Однако, в PHx все же реализовано кеширование, но с ошибкой, из-за которой оно не работает.
Я внес изменения в файл
/assets/plugins/phx/phx.parser.class.inc.php, которые позволяют phx использовать системный кеш $modx->snippetCache и не порождать лишние запросы к БД.
На одном проекте я уже применил этот патч, уменьшив количество запросов на
10-50 шт. на страницах (и там еще есть, куда оптимизировать).
Прикладываю пропатченный файл с изменениями из моего комментария, которые позволяют phx использовать системный кеш сниппетов. Это максимально возможная оптимизация phx по использованию БД.
Файл:
phx.parser.class.inc.php (пропатченный)
Класть сюда: /assets/plugins/phx/phx.parser.class.inc.php
Комментарии (37)
RSS свернуть / развернутьNevroZ
elastic
PS: кат, плиз. Тема, очевидно, выйдет на главную.
Carw
Dronowar
antonkuzmin
pitbull
antonkuzmin
pitbull
Dronowar
Вот модифицированный фрагмент из поста:
Подскажите, куда лучше загрузить патченный файл phx.parser.class.inc.php?
antonkuzmin
Carw
antonkuzmin
Andchir
Andchir
Вообще-то если смотреть на Друпал, там может и 600 запросов к базе возникнуть на пустом месте, и это не кривые руки виноваты, да и друпальщиков от этого меньше не становится )
А постом своим я совершаю совершенно обратную операцию. Знаете ли, лучше дать возможность разработчикам сразу узнать, почему сайт глохнет от 10 одновременных пользователей и это исправить, чем в неведении они просто мигрируют «с этой неповоротливой modx» на какую-нибудь джумлу )
antonkuzmin
antonkuzmin
Andchir
Мне только заголовок не понравился :)
Andchir
Carw
Моя деятельность частично пересекается с рекламой и маркетингом, поэтому меня во фразе «до 100» ничего не смущает :)
antonkuzmin
Carw
Fatal error: Call to undefined method DocumentParser::Log() in /home/virtwww/w_nnttv-ru_29ecd83e/http/assets/plugins/phx/phx.parser.class.inc.php on line 311
Dronowar
antonkuzmin
Советую также замерить количество запросов с исходной версией и с обновленной — для этого в любом месте надо написать тег [^q^]
antonkuzmin
Результаты следующие
//non-optimized phx
S:database | QT:1.8135 s | Q:227 | P:8.0063 s | T:9.8198 s
//optimized phx
S:database | QT:0.6842 s | Q:228 | P:5.1530 s | T:5.8372 s
Количество запросов не уменьшилось, уменьшилось время. Но это еще может зависить от нагрузки на сервер. По-этому я так понимаю у меня не сработало:(
kollad
tonatos
Carw
на внутренних в первый раз — больше 100, после перезагрузки страницы — сокращается до пары десятков.
antonkuzmin
Во-первых был такой кусок, для построения левого меню навигации
[+phx:if=`[[Ditto? id=`sub[+id+]` &parents=`[+id+]` &filter=`isfolder,1,1` &noResults=`nochilds`]]`:isnot=`nochilds`:then=`<ul>[[Ditto? id=`sub[+id+]` &parents=`[+id+]` &display=`all` &save=`1` &tpl=`subcatalog_tplLeft` &filter=`isfolder,1,1` &noResults=` ` &sortBy=`menuindex` &sortDir=`ASC` ]]</ul>`:else=``+]
Это делал давно, и видимо для того, чтобы не создавались пустые <ul></ul>, если в документе нету подраздела(подкаталога)…
Сейчас в целях оптимизации, оптимизировал этот кусок, а точнее убрал PHx, и оставил только
<ul>[[Ditto? id=`sub[+id+]` &parents=`[+id+]` &display=`all` &save=`1` &tpl=`subcatalog_tplLeft` &filter=`isfolder,1,1` &noResults=` ` &sortBy=`menuindex` &sortDir=`ASC` ]]</ul>
Количество запросов уменьшилось вдвое:) уже радует:) сейчас вообще пишу свой сниппет, для создания каталога… Потому что дитто уже слишком тяжелый для моего сайта-магазина…
Кому интересно посмотреть что там — sunnyland.com.ua
внизу в футере данные по загрузке страницы
kollad
Carw
А каталог в принципе довольно быстро пишется, я беру все те же шаблоны, что используются в Ditto, то-есть принцип работы, шаблоны и тд. остается прежним, просто для построения каталога, у меня будет не огромно количество запросов, как делает Ditto, а одним запросом из базы)
kollad
Carw
Andchir
Carw
kollad
Carw
kollad
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.