php - Doctrine 2.2 + Zend Framework 分页速度优化

标签 php performance doctrine-orm

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

相关文章:

javascript - 推迟 Trip Advisor 脚本

php - 如何使用 Doctrine2 中的 EntityManager 检索具有所有关联的实体?

php - 如何获取表单类型中实体的 ID?

php - 在php中合并两个图像

MongoDB 聚合 V/S 简单查询性能?

wcf - 为什么 wcf 客户端连接到服务时这么慢?

doctrine-orm - 确定 Composer 子依赖

php - 如何将 session 添加到我的表单中?

java - Java ReSTLet API 可以与 REST PHP API 一起使用吗?

javascript - 查询不会从页面获取变量