Вывод данных из кастомной таблицы

Всем привет!
Пишу уже некоторое время на 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 раз и не париться), могут быть различные динамические параметры (в таком же большом объеме), для каждого пользователя по отдельности.
Дмитрий
08 мая 2016, 10:26
modx.pro
2 397
0

Комментарии: 5

Дмитрий
08 мая 2016, 13:35
0
Почему я сомневаюсь в правильности решения.
Например, у меня есть смутное сомнение, что $modx->getChunk() в цикле не есть хорошо, ибо все 500 раз запускается и отрабатывает по новой. Возможно есть более дешевый способ?

Например, как в jQuery: можно потрогать и записать кусочек DOM в переменную $var, и затем анализировать его как угодно, не трогая документ снова.
    Илья Уткин
    08 мая 2016, 15:41
    1
    +2
    Вообще, подход правильный. Можно ускорить, используя $pdo->getChunk()
      Дмитрий
      08 мая 2016, 19:21
      +1
      Действительно. Судя по результатам webpagetest скорость ответа от сервера увеличилась в два с половиной раза! Кроме того, судя по тесту, при повторном прогоне, скорость ответа снова порезалась почти в 2 раза. Обычное кэширование страницы здесь ни причем, ибо тест со стандартным методом возвращает ответ с одинаковой скоростью при первом и втором прогоне.
      Итого, прирост скорости в моем случае, в 4.5 раза.
      Спасибо!

      А что касается прямых запросов к бд?
      Регистрация сервиса в modx каким-то образом увеличит скорость? (я сомневаюсь)
        Дмитрий
        08 мая 2016, 19:40
        +1
        Кому интересно, вот результаты:
        $modx->getChunk() в цикле:
        1-й проход:

        2-й проход:


        $pdo->getChunk() в цикле:
        1-й проход:

        2-й проход:
          Дмитрий
          09 мая 2016, 06:03
          0
          $pdo->getChunk() в цикле с использованием строки @INLINE оказался чуточку быстрее:
          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

          Кстати, про кеширование, я похоже погорячился
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      5