2012-06-03 23 views
4

我的Symfony2应用程序有一些性能问题,所以我运行了一个webgrind以查看发生了什么。事实证明,它是每个请求解析大量的YML文件,我不明白为什么。我已经启用了APC缓存,因此我不知道它会是什么。任何有关这个问题的帮助将不胜感激。Symfony2应用程序在每个请求上解析YML

编辑:这是我跑过的webgrind的屏幕截图。 http://i.imgur.com/m7g6l.jpg

+1

删除YML文件,因此它们不能被加载(或你期望的w样的意见/ O实际没有提供具体的信息?)。 – hakre

+0

我可以提供什么具体信息? webgrind给我的所有信息是YML解析函数在每个请求中被调用,我不知道究竟哪些文件正在被解析。 – user1045879

+1

您是在生产模式还是在开发中运行?在生产模式下,YML解析的结果被缓存。 – Cerad

回答

1

找出发生了什么事。我有APC启用和工作,但没有在我的autoload.php中使用ApcUniversalClassLoader。更多详情here。当他们在文档中提出改进性能的“建议”时,他们确实的意思是“你必须这样做,否则你的表现会很糟糕。”

+0

让APC有这种效果,我感到非常惊讶。由于@Cerad提到YAML文件应该被缓存在生产方法中,而不管你的类加载器缓存如何。我已经运行Symfony 2,没有任何类加载器缓存,性能很好(例如使用不带apcu的PHP opcache)。 – Ryan

+0

瑞恩 - 你跑2.5+吗?我正在运行2.3,并在遍历代码之后,发现Doctrine使用默认的“数组缓存”,每个页面加载/实例都会过期。 在2.3中,除非将此缓存方法更改为APC,memcached或其他选项,否则每次页面加载时都会分析Doctrine元数据(即YAML orm文件)。也许2.5改变这种行为。 无论如何,我怀疑上面提到的APC变化对YAML也有任何影响。从我看到的(以及从文档中),Doctrine不会使用APC,除非您专门配置它。 –

+0

从查看文档,2.5也需要Doctrine缓存驱动程序配置,所以也许你已经配置好了。我很好奇你是否正在运行app/config/config中ORM部分的默认设置。yml或者实际上是配置为使用适当的缓存。 –

2

从我的研究中看来,APCClassLoader不会导致Symfony2缓存在Doctrine中使用的YAML文件。它默认显示(config.yml,parameters.yml)缓存配置文件,而是由学说实际使用的ORM YAML文件,除非指定如文档中链接如下一个高速缓存驱动器不会被缓存:

http://symfony.com/doc/2.3/reference/configuration/doctrine.html#caching-drivers

因此,如果海报只有配置YAML而不是教条YAML,上述解决方案可能解决了问题。但是,如果涉及Doctrine YAML,则必须指定Doctrine缓存驱动程序。

这也影响到使用Annotations的人,因为除非指定了高速缓存驱动程序(除了Doctrine默认数组高速缓存),否则每个页面加载时都会对其进行解析。

认为我应该发布,因为这是一个复杂的问题,上面的答案是误导我的情况下,原则ORM YAML文件是缓存问题的来源。

这个职位对我的具体问题的更多细节和分辨率:

Why is Symfony2 app spending 70-90% of its time parsing YAML?

+0

嘿,@Nate Stone,你知道这个文档字符串缓存是否可以与表单验证* yaml *文件一起工作吗? –

+0

该文档似乎表明验证使用APC默认情况下根据此引用:http://symfony.com/doc/current/components/validator/resources.html#caching 有一个相关的错误/功能线程,他们讨论设置你自己的服务:https://github.com/symfony/symfony/pull/12975 –