最近,我将Doctrine 2 Orm集成到CodeIgniter 2中。我将其配置为库2,并在CodeIgniter中自动加载。在页面中,我以以下方式实例化学说实体管理器:

private static $em = null;

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

然后,我在需要时开始使用实体管理器。我遇到的问题是,在每个页面中,请求Entity Manager需要一些时间来初始化(Ably 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函数基本使EntityManager-> find()调用:

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

即使我使用EntityManager-> createquery()方法,我也必须等待1秒钟。

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

这很常见吗?

这1秒是否来自EntityManager需要建立与DB的联系的事实?第一个请求后的功能/请求很快。

有帮助吗?

解决方案

教义所做的最耗时的事情是为您的实体加载元数据,无论是注释,XML还是YAML。学说懒惰在可能的情况下加载元数据,因此在开始使用实体之前,您不会看到性能命中。由于元数据没有更改,除非您对代码进行更改,否则学说允许您在请求中缓存元数据。 DQL查询也需要解析为SQL,因此学说为此提供了另一种缓存配置。

在生产环境中,您应该设置这些缓存(听起来好像您已经拥有,但对于其他人来说):

$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();

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

$configuration->setAutoGenerateProxyClasses(false);

希望这对您有所帮助。可以在 http://www.doctrine-project.org/docs/orm/2.0/en/reference/improving-performance.html#bytecode-cache

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top