Вывод данных из кастомной таблицы
Всем привет!
Пишу уже некоторое время на MODx, и вдруг задумался, а правильно ли я это делаю в плане оптимизации.
Стандартный пример:
Допустим, есть кастомная таблица в бд, например о животных, из которой нужно подставить данные в большой, кастомный список.
Мой стандартный порядок действий:
1. Пишу чанк-обертку animals_wrap (если размещается на нескольких страницах):
Верный ли это алгоритм действий? Если учесть, что вместо животных (которых можно закешировать 1 раз и не париться), могут быть различные динамические параметры (в таком же большом объеме), для каждого пользователя по отдельности.
Пишу уже некоторое время на MODx, и вдруг задумался, а правильно ли я это делаю в плане оптимизации.
Стандартный пример:
Допустим, есть кастомная таблица в бд, например о животных, из которой нужно подставить данные в большой, кастомный список.
Мой стандартный порядок действий:
1. Пишу чанк-обертку animals_wrap (если размещается на нескольких страницах):
<div>
[[!animals_items]]
</div>
2. Пишу чанк для отдельных итемов animals_item:<div>
<img src="[[++imgs]][[+img]]">
<div>
<span>[[+name]]</span>
<span>[[+desc]]</span>
</div>
</div>
2. Пишу сниппет animals_items:$modx->runSnippet('debug');
$query = $modx->prepare("SELECT img, name, desc FROM animals ORDER BY name ASC");
$query->execute();
$animals = $query->fetchAll(PDO::FETCH_ASSOC);
$animals_list = '';
foreach($animals as $animal){
$animals_list .= $modx->getChunk('animals_item', Array(
'img' => $animal['img'],
'name' => $animal['name'],
'desc' => $animal['desc']
));
}
return $animals_list;
3. В итоге, получаю большой список на 500+ итемов. (Допустим, что нужно именно столько без пагинации)Верный ли это алгоритм действий? Если учесть, что вместо животных (которых можно закешировать 1 раз и не париться), могут быть различные динамические параметры (в таком же большом объеме), для каждого пользователя по отдельности.
Комментарии: 5
Почему я сомневаюсь в правильности решения.
Например, у меня есть смутное сомнение, что $modx->getChunk() в цикле не есть хорошо, ибо все 500 раз запускается и отрабатывает по новой. Возможно есть более дешевый способ?
Например, как в jQuery: можно потрогать и записать кусочек DOM в переменную $var, и затем анализировать его как угодно, не трогая документ снова.
Например, у меня есть смутное сомнение, что $modx->getChunk() в цикле не есть хорошо, ибо все 500 раз запускается и отрабатывает по новой. Возможно есть более дешевый способ?
Например, как в jQuery: можно потрогать и записать кусочек DOM в переменную $var, и затем анализировать его как угодно, не трогая документ снова.
Вообще, подход правильный. Можно ускорить, используя $pdo->getChunk()
Действительно. Судя по результатам webpagetest скорость ответа от сервера увеличилась в два с половиной раза! Кроме того, судя по тесту, при повторном прогоне, скорость ответа снова порезалась почти в 2 раза. Обычное кэширование страницы здесь ни причем, ибо тест со стандартным методом возвращает ответ с одинаковой скоростью при первом и втором прогоне.
Итого, прирост скорости в моем случае, в 4.5 раза.
Спасибо!
А что касается прямых запросов к бд?
Регистрация сервиса в modx каким-то образом увеличит скорость? (я сомневаюсь)
Итого, прирост скорости в моем случае, в 4.5 раза.
Спасибо!
А что касается прямых запросов к бд?
Регистрация сервиса в modx каким-то образом увеличит скорость? (я сомневаюсь)
Кому интересно, вот результаты:
$modx->getChunk() в цикле:
1-й проход:
2-й проход:
$pdo->getChunk() в цикле:
1-й проход:
2-й проход:
$modx->getChunk() в цикле:
1-й проход:
2-й проход:
$pdo->getChunk() в цикле:
1-й проход:
2-й проход:
$pdo->getChunk() в цикле с использованием строки @INLINE оказался чуточку быстрее:
1. 0.769s
2. 0.668s
В свою очередь, странные результаты дала конструкция:
1. 2.294s
2. 0.537s
Кстати, про кеширование, я похоже погорячился
1. 0.769s
2. 0.668s
В свою очередь, странные результаты дала конструкция:
$tpl = $pdoTools->getChunk('chunk');
$animals_list = '';
foreach($animals as $animal){
$animals_list .= $pdoTools->getChunk($tpl, Array(
'img' => $animal['img'],
'name' => $animal['name'],
'desc' => $animal['desc']
));
}
Где чанк содержит в себе приписку @INLINE:1. 2.294s
2. 0.537s
Кстати, про кеширование, я похоже погорячился
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.