我在使用 Doctrine 2 时与 HYDRATE_OBJECT
的性能作斗争。当我从HYDRATE_ARRAY
切换到HYDRATE_OBJECT
时,需要将近10倍的时间!我使用教义 2 和 zend paginator 作为参考:
$query = $em->createQuery($dql)
->setHydrationMode(DoctrineORMAbstractQuery::HYDRATE_ARRAY)
->setParameter('x', 1);
// Pagination
$paginator = new DoctrineORMToolsPaginationPaginator($query, false);
$iterator = $paginator->getIterator();
die(); // 160 ms
与
$query = $em->createQuery($dql)
->setHydrationMode(DoctrineORMAbstractQuery::HYDRATE_OBJECT)
->setParameter('x', 1);
// Pagination
$paginator = new DoctrineORMToolsPaginationPaginator($query, false);
$iterator = $paginator->getIterator();
die(); // 1.4s
我应该注意什么?如何减少处理时间并仍然利用HYDRATE_OBJECT
?有没有更好的方法来完成分页?
*编辑:使用->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
实体?
我现在通过为 Doctrine 分页创建一个 Zend 分页适配器包装器来解决这个问题;
<?php
class PaginatorAdapter extends DoctrineORMToolsPaginationPaginator implements
Zend_Paginator_Adapter_Interface
{
public function getItems($offset, $itemCountPerPage)
{
$this->getQuery()->setFirstResult($offset)->setMaxResults($itemCountPerPage);
return $this->getQuery()->getResult($this->getQuery()->getHydrationMode());
}
}