2011-07-23 22 views
0

最近我将Doctrine 2 ORM集成到CodeIgniter 2中。我将Doctrine 2配置为一个库并将它自动加载到CodeIgniter中。在一个页面我实例学说实体管理器以下列方式:Doctrine 2 EntityManager在第一次请求中导致时间损失

private static $em = null; 

public function __construct() { 
    parent::__construct(); 
    $this->em = $this->doctrine->em; 
} 

然后我开始在需要的时候使用实体管理器。我遇到的问题是,在每个页面请求中,实体管理器需要一些时间来初始化(大约1秒)。这会导致用户等待页面加载。下面你可以看到一些性能结果我测:

BENCHMARKS 
Loading Time: Base Classes   0.0166 
Doctrine       0.0486 
GetArticle       1.0441 
Functions       0.0068 
Controller Execution Time   1.1770 
Total Execution Time    1.1938 

的GetArticle功能basicly使一个EntityManager->找到()调用:

$currentart = $this->em->find('Entities\Article', $artid); 

我不得不等待一个1第二偶如果我使用EntityManager-> createQuery()方法。

在每个页面中,由于EntityManager的第一个请求,我有大约1秒的时间损失。

这是常见的吗?

这1秒钟来自EntityManager需要建立到DB的连接的事实吗?第一次请求后的功能/请求相当快。

回答

1

Doctrine最耗时的事情是为您的实体加载元数据,无论是注释,XML还是YAML。 Doctrine会在可能的情况下延迟加载元数据,因此直到您开始使用实体时才会看到性能。由于元数据不会改变,除非您对代码进行更改,Doctrine允许您跨请求缓存元数据。 DQL查询也需要被解析成SQL,所以Doctrine为此提供了另一个缓存配置。

在生产环境中,你应该设置这些缓存起来(这听起来像你已经有,但对于其他人阅读本):

$cache = new \Doctrine\Common\Cache\ApcCache(); // or MemcacheCache $configuration->setMetadataCachImpl($cache); // caches metadata for entities $configuration->setQueryCachImpl($cache); // caches SQL from DQL queries

为了防止完全占据第一页负载元数据加载时,您可以设置缓存加载器,加载所有类元数据并将其保存到缓存中。

$em->getMetadataFactory()->getAllMetadata();

另一个潜在的瓶颈是代理类的产生。如果在生产环境中配置不正确,则Doctrine将在每次加载页面时生成类并将其保存到文件系统。除非实体的代码改变,否则这些代理类不会改变,所以再次发生这种情况也是不必要的。和禁用自动生成:为了加快速度,你应该使用命令行工具(生成的代理ORM):生成代理

$configuration->setAutoGenerateProxyClasses(false);

希望这有助于你出去。一些更多的信息可以在http://www.doctrine-project.org/docs/orm/2.0/en/reference/improving-performance.html#bytecode-cache

+0

嗨,谢谢你的回答。不幸的是,我已经阅读了您发送的链接中的内容。正如你所指出的,我也已经使用ApcCache。它仍然看起来像是在每个请求中加载元数据,即使我使用的是ApcCache。 另一个有趣的事情指出,我没有看到ApcCache,ArrayCache之间的任何性能差异。从目前为止我阅读的文章中,我预计我的应用程序在使用ApcCache时应该会更好。 难道我的ApcCache配置不正确?或者也许是因为我在本地主机上开发我的应用 –

+0

我应该在哪里放置下面的代码:$ em-> getMetadataFactory() - > getAllMetadata(); 我也已经事先用orm:generate-proxies生成了Proxy类。所以问题必须在别的地方。 –

+0

ApcCache要求您安装APC并正确使用PHP。检查你的phpinfo()以确保它确实工作。 –

相关问题