由于学说方法调用,ZF2 Doctrine2 App非常慢

时间:2015-11-25 15:33:33

标签: doctrine-orm zend-framework2

虽然只有6个数据库查询,但我的应用主页的请求时间大约为5秒。所以我决定在我的本地服务器上安装带有webgrind的xdebug来配置我的应用程序。在那里我可以看到,我有大量的学说方法调用,但我不知道如何解释这个以减少调用的次数。也许有人可以给我一个提示。

webgrind

RestaurantRepository

public function findByCity(City $city) {
    $queryBuilder = $this->createQueryBuilder('restaurant');
    $queryBuilder->addSelect('cuisines')
        ->addSelect('openingHours')
        ->addSelect('address')
        ->addSelect('zipCode')
        ->addSelect('city')
        ->leftJoin('restaurant.cuisines', 'cuisines')
        ->leftJoin('restaurant.openingHours', 'openingHours')
        ->leftJoin('restaurant.meals', 'meals')
        ->innerJoin('restaurant.address', 'address')
        ->innerJoin('address.zipCode', 'zipCode')
        ->innerJoin('zipCode.city', 'city')
        ->where('zipCode.city = :city')
        ->andWhere('restaurant.state <= :state')
        ->setParameter('city', $city)
        ->setParameter('state', Restaurant::STATE_ENABLED)
        ->orderBy('restaurant.state', 'ASC')
        ->addOrderBy('restaurant.name', 'ASC');

    return $queryBuilder->getQuery()->getResult();
}

Detailed method calls

2 个答案:

答案 0 :(得分:0)

您可能会加载某些实体的所有关联。如果没有关于您的实体定义和正在执行的查询的更多信息,很难说问题究竟在哪里。

在学说文档中有一些关于 improving performance 的建议(其中一个是关于延迟加载关联)可能有助于您继续前进。

答案 1 :(得分:0)

安装并启用ZendDeveloperToolbar module。在那里,您可以检查每次操作所进行的DB调用次数。

正如你在图像上看到的那样,引擎盖下有很多水合作用。网上有很多关于如何不使用Doctrine的教程。如果不看你正在对你的实体做什么,我就无法说出任何话。

还要确保在生产模式下启用了缓存,因此Doctrine不必解析每个请求的映射信息,这非常繁重。您可能正在使用注释驱动程序,这是最慢的驱动程序。

我还可以看到你使用的Zend自动加载器与Composer相比效率很低。只需将您的modules / src添加到composer.json文件的自动加载部分,然后让Composer进行自动加载。