@pavelkey

Возможно ли ускорить вывод 400+ услуг с ценами на одной странице?

Здравствуйте!
Третий день ищу решение задачи - на сайте есть раздел "Цены" в виде "Название услуги" + "Цена" и таких около 400 записей. Средняя длительность загрузки страницы - 17 сек. В шаблоне выводим так:
[!getImageList?
&tvname=`price_migx_items`
&tpl=`tpl_price_migx`
&docid=`[[*id]]`
&limit=`999`
 ]


tpl_price_migx на который ссылка выше, также содержит вывод getimagelist -
[[!getImageList?
&tvname=`price_migx`
&tpl=`tpl_price_migx_include`
&docid=`[[*id]]`
&limit=`999`
 ]]


Из вышеуказанного чанка идет ссылка на чанк tpl_price_migx_include
[[getImageList?
&value=`[[+migx]]`
&tpl=`tpl_price_migx_include_p`
&docid=`[[*id]]`
&limit=`999`
]]


И далее tpl_price_migx_include_p
<div class="table__body table__row">
    [[-<div class="table__col table__col-1">
        <span>[[+MIGX_id]]</span>
    </div>
    <div class="table__col table__col-2">
        <span class="hide-mobile">[[+article]]</span>
    </div>-]]
    <div class="table__col table__col-3">
        <span>[[+link-1:ne=``:then=`<a href="">[[+title-1]]</a>`:else=`[[+title-1]]`]]</span>
        [[-<span class="show-mob">Артикул: [[+article]]</span>-]]
    </div>
    <div class="table__col [[+type:is=`3`:then=`table__col__sale`]] table__col-4">
        [[+type:is=`1`:then=`<span class="img-vr">[[+price]] руб.</span>`]]
        [[+type:is=`2`:then=`<span class="img-vr">Бесплатно</span>`]]
        [[+type:is=`3`:then=`<span>
                <span class="title">Акция!</span>
                <span class="new">[[+price-2]] руб.</span>
                <span class="old">[[+price]] руб.</span>
            </span>`]]
    </div>
</div>


Не очень понимаю зачем такое сложное строение.
Один человек предложил реализовать так - переводим страницу с ценами в HTML и проблема решена. Сделали, загрузка примерно 1-2 сек, но проблема в том, что на сайте есть также раздел "Услуги" с отдельными страницами услуг, на каждую страницу мы выводим цены как раз из раздела "Цены".

Есть ли вариант, чтобы скажем раздел "Цены" был в виде html-файла, а когда нужно поправить цену - нажимаем какую-то магическую кнопку в админке и возвращается вышеуказанная структура, далее правим цены, снова нажимаем волшебную "Перегенерировать в HTML" и на выходе получаем быструю загрузку раздела и простоту в редактировании? Или другие варианты, которые в ускорят загрузку страницы и сохранят легкость в редактировании цен.

Заранее благодарю, если подскажите в какую сторону копать.
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 3
@rPman
Я не работал с modx, документация говорит что это php+mysql.

17 секунд на формирование всего 400 записей это необычно долго. С высокой вероятностью там происходит что то типа - на каждую запись выполняется сложный запрос вместо того, чтобы сделать все одним.
Традиционно, в любом приложении, узкие места начинают искать с помощью профилирования - оценке времени выполнения разных мест в коде (как долго в сумме в какой функции идет выполнение) и sql запросов (можно средствами базы данных, а можно все тем же профилировщиком кода).
Ключевые слова для гугла - php-spx, xhprof

Возможно в базе данных не созданы необходимые индексы (по каждому медленному запросу делать explain), или сама установка mysql не настроена как следует (например выделено маленькое количество оперативной памяти и индексы в нее не влезают)...

Почти наверняка можно данную задачу решить не средствами фреймворка modx, а напрямую, написав вручную sql запрос и сформировав страницу кодом на php, тем более изначально php это язык создания шаблонов.
Сделали, загрузка примерно 1-2 сек
вот тут наверняка этот запрос и сделали, почему бы его и не вставить напрямую в страницу вывода цен, а не формировать html капк кеш.
Ответ написан
Комментировать
@alexalexes
Напишите сниппет, в котором соберите список HTML простой склейкой тегов, используя только PHP и SQL запросы, и пару вспомогательных сниппетов, которые могут достать отдельные элементы списка.
В коде сниппета нужно избегать обращение к объектам Modx, особенно, если что-то циклически формировать, всю модель данных брать из таблиц базы данных.
Это будет самое быстрое решение.
Ответ написан
Комментировать
an-tar
@an-tar Куратор тега MODX
Full stack web developer
Что можно попробовать
1. сделайте первый вызов некешированным(убрать восклицательный знак)
[!getImageList
2. Если это не поможет, перепишите все в виде сниппета, где реализуйте более точные выборки из базы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы