学说2 EntityManager在第一个请求中导致时间损失
-
22-10-2019 - |
题
最近,我将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