Modx и вывод данных из БД

Опубликовано: / Просмотрено: 673 /

И вначале реклама, небольшой блок. Прошу не сердиться и не вносить ее в фильтры блокировщиков.

подробнее о рекламодателе можно узнать внутри блока
Спасибо. А теперь сам материал.

Простой скрипт замера работы getIterator, stmt или getСollection

 Данные из таблицы в MODX можно выводить по-разному - с помощью $modx->getIterator, с помощью стандартных для PDO методов prepare(); и потом stmt->execute(); Есть еще getCollection . Выбирая, что применить, нашел эту статью, где сравнивают getcollection и pdo. Но нигде не нашел сравнения с getIntegrator, который должен быть легче для всего. В итоге с помощью доков и подручных средств набросал скрипт проверки работы для своего класса, может и вам пригодиться

$q = $modx->newQuery('ClassTable');

//условия для выборки или что-то еще, для реальной проверки, которая будет использоваться

$q->where(array('param'=>'value'));


$start = microtime(true);
$resultsIterator = $modx->getIterator('ClassTable', $q);
$resultsArrayIterator = [];
foreach ($resultsIterator as $result) { 
$resultsArrayIterator[] = $result->toArray();
}

$end = microtime(true);
$timeIterator = $end - $start;
$countIterator = count($resultsArrayIterator);

$start = microtime(true);
$resultsCollection = $modx->getCollection('ClassTable', $q);
$resultsArrayCollection = [];
foreach ($resultsCollection as $result) { 
$resultsArrayCollection[] = $result->toArray();
}

$end = microtime(true);
$timeCollection = $end - $start;
$countCollection = count($resultsArrayCollection);

$start = microtime(true);
$stmt = $q->prepare();

$stmt->execute();

$resultsArrayExecute = $stmt->fetchAll(PDO::FETCH_ASSOC);

$end = microtime(true);
$timeExecute = $end - $start;

$countExecute = count($resultsArrayExecute);



// Вывод результатов

echo "Результаты с использованием getIterator():\n";
echo "Количество результатов: " . $countIterator . "\n";
echo "Время выполнения: " . $timeIterator . " сек.\n\n";

echo "Результаты с использованием getCollection():\n";
echo "Количество результатов: " . $countCollection . "\n";
echo "Время выполнения: " . $timeCollection . " сек.\n\n";

echo "Результаты с использованием execute() и fetchAll():\n";
echo "Количество результатов: " . $countExecute . "\n";
echo "Время выполнения: " . $timeExecute . " сек.\n";



// Вывод массивов данных для проверки при необходимости

echo "Массив данных, полученный с использованием getIterator():\n";
var_dump($resultsArrayIterator);



echo "Массив данных, полученный с использованием getCollection():\n";
var_dump($resultsArrayCollection);

echo "Массив данных, полученный с использованием execute() и fetchAll():\n";
var_dump($resultsArrayExecute);

В итоге у меня были такие показатели

Результаты с использованием getIterator():
Количество результатов: 163
Время выполнения: 0,048829078674316 сек.

Результаты с использованием getCollection():
Количество результатов: 163
Время выполнения: 0,052037954330444 сек.

Результаты с использованием execute() и fetchAll():
Количество результатов: 163
Время выполнения: 0,0012261867523193 сек.

Но для справедливости замечу, что если не выводить массив, а проводить другие операции, то getIterator быстрее всех т.к. по умолчанию он не возвращает массив данных, а позволяет пошагово работать . Я же просчитывал именно с получением сразу массивом данных (его я буду передавать в чанк), поэтому для меня оказался быстрее метод pdo. Но это не значит, что и вам подойдет, просто я в восторге от этого скрипта и решил поделиться. Но я в восторге и от getIterator :-) вот официальная документация по нему https://docs.modx.com/3.x/ru/extending-modx/xpdo/class-reference/xpdo/xpdo.getiterator для небольшого объема данных он очень удобен. Вобщем я еще в сомнении, что все-таки применять, поэтому слишком серьезно не относитесь и прошу прощения, если этот код вызвал у вас стыд. 

О мой стыд, те, кто читал эту заметку вероятно увидели, что я вместо getIterator в тексте писал integrator. За что прошу прощения - исправил.

 


Теги: