学说 2.2 + Zend 框架分页速度优化


Doctrine 2.2 + Zend Framework pagination speed optimization

我在使用 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

$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?有没有更好的方法来完成分页?

*编辑:使用->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只知道$itemsPerPagecount($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());
    }
}