Я борюсь с производительностью Doctrine 2 при использовании HYDRATE_OBJECT
. Когда я переключаюсь с HYDRATE_ARRAY
на HYDRATE_OBJECT
, это занимает почти в 10 раз больше времени! Я использовал доктрину 2 и zend paginatorв качестве справки:
$query = $em->createQuery($dql)
->setHydrationMode(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY)
->setParameter('x', 1);
// Pagination
$paginator = new Doctrine\ORM\Tools\Pagination\Paginator($query, false);
$iterator = $paginator->getIterator();
die(); // 160 ms
vs
$query = $em->createQuery($dql)
->setHydrationMode(\Doctrine\ORM\AbstractQuery::HYDRATE_OBJECT)
->setParameter('x', 1);
// Pagination
$paginator = new Doctrine\ORM\Tools\Pagination\Paginator($query, false);
$iterator = $paginator->getIterator();
die(); // 1.4s
На что следует обратить внимание? Как сократить время обработки и при этом использовать HYDRATE_OBJECT
? Есть ли лучший способ выполнить разбиение на страницы?
*Edit: Использование ->setFirstResult($itemsPerPage * $page - $itemPerPage)->setMaxResults($itemsPerPage);
значительно сокращает время загрузки, но при использовании $iterator
:
$adapter = new \Zend_Paginator_Adapter_Iterator($iterator);
$zend_paginator = new \Zend_Paginator($adapter);
$zend_paginator->setItemCountPerPage($itemsPerPage)
->setCurrentPageNumber($page);
Zend знает только о $itemsPerPage
, ( count($iterator) == $itemsPerPage
) и поэтому ссылки на страницы всегда вычисляют только 1 страницу. Как я могу правильно разбить страницы с помощью Zend_Paginator и загрузить только объекты $itemsPerPage
?