Doctrine 2.2 + Zend Framework分页速度优化

Jon*_*eig 5 php performance doctrine-orm

我正在努力使用Doctrine 2表演HYDRATE_OBJECT.当我切换HYDRATE_ARRAYHYDRATE_OBJECT,它需要将近10倍!我使用了doctrine 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我应该注意什么?如何减少处理时间仍然使用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);
Run Code Online (Sandbox Code Playgroud)

Zend只知道$itemsPerPage,(count($iterator) == $itemsPerPage)因此分页链接总是只计算1页.如何使用Zend_Paginator完成正确的分页,并且只加载$itemsPerPage实体?

Jon*_*eig 5

我现在通过为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());
    }
}
Run Code Online (Sandbox Code Playgroud)