2012-06-03 53 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 –