我在使用 HYDRATE_OBJECT
时遇到了 Doctrine 2 性能问题。当我从 HYDRATE_ARRAY
切换到 HYDRATE_OBJECT
时,它花费了将近 10 倍的时间!我用过 doctrine 2 and 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
对比
$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);
显着减少加载时间,但是当使用$迭代器
:
$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 Doctrine\ORM\Tools\Pagination\Paginator implements
Zend_Paginator_Adapter_Interface
{
public function getItems($offset, $itemCountPerPage)
{
$this->getQuery()->setFirstResult($offset)->setMaxResults($itemCountPerPage);
return $this->getQuery()->getResult($this->getQuery()->getHydrationMode());
}
}
关于php - Doctrine 2.2 + Zend Framework 分页速度优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10962802/