關(guān)于symfony性能
Hi,洪大師:
? ? ? ? ? ? ? 有個(gè)關(guān)于symfony的性能問(wèn)題想請(qǐng)教一下,我們目前用symfony做了一個(gè)項(xiàng)目,通過(guò)對(duì)discuz做的一個(gè)依賴注入來(lái)實(shí)現(xiàn)插件的開發(fā),實(shí)現(xiàn)方式是在discuz加載配置的時(shí)候載入了symfony并重寫了 discuz的配置。這個(gè)就導(dǎo)致了我們現(xiàn)在開發(fā)的這個(gè)產(chǎn)品的性能上不去,目前測(cè)tps (每秒事務(wù)數(shù))也就是 100左右,discuz原生的環(huán)境首頁(yè)tps在500左右,在symfony框架下輸出phpinfo在我們的測(cè)試環(huán)境下tps只有300左右 。
?目前symfony部分已經(jīng)做的優(yōu)化:
在web/app.php中開啟apc緩存加載:
$loader= require_once __DIR__.'/../app/bootstrap.php.cache';
$apcLoader = new ApcClassLoader(sha1(__FILE__), $loader);
在app/config/config.yml中開啟了doctrine的查詢緩存,將doctrein的metadata_cache_driver,query_cache_driver,result_cache_driver,設(shè)置為redis緩存
在將symfony設(shè)置為prod模式.ps:這一塊可能有點(diǎn)問(wèn)題,因?yàn)槲以谵D(zhuǎn)為prod模式的時(shí)候出現(xiàn)Segmentation fault 提示,但是我看了額app/cache的目錄下 prod的文件夾也生成了。去google了好久也沒(méi)找到問(wèn)題的所在,在源碼中抓 也沒(méi)抓到,好奇怪。
在composer中的自動(dòng)加載也做了優(yōu)化?composer dump-autoload --optimize ,優(yōu)化了生成了一個(gè)自動(dòng)加載的數(shù)組。
大師,你看看還有什么地方可以再做優(yōu)化的么?
以上的壓測(cè)數(shù)據(jù)是單臺(tái)壓測(cè)的結(jié)果。
我們的項(xiàng)目的PV大概有1400W。架構(gòu)里面有3臺(tái)php機(jī),前面2臺(tái)代理機(jī),3臺(tái)mysql(1主2從),2臺(tái)redis(主從)所有現(xiàn)在壓測(cè)的結(jié)果是不符合要求的。
謝謝了
By ?山雞的機(jī)
2015-05-04
如果是這種搭配其他框架使用的例子我建議你把sf2的項(xiàng)目做成一個(gè)單獨(dú)的項(xiàng)目,然后用sso之類的方法去做跨項(xiàng)目之間的用戶共享。
doctrine的cache如果你在操作數(shù)據(jù)不是很頻繁的時(shí)候其實(shí)幫助是不大的。
composer dump-autoload --optimize其實(shí)主要就是把你的vendor里的所有php類預(yù)先載入一個(gè)大的php文件,這樣載入起來(lái)就會(huì)比較快。
從性能優(yōu)化上來(lái)說(shuō),sf2由于默認(rèn)開啟的功能和組件非常多,有很多你如果用不到的東西可以關(guān)掉,當(dāng)然也有很多地方可以優(yōu)化,但我我建議你先裝一個(gè)系統(tǒng)調(diào)用圖生成工具,把運(yùn)行一個(gè)具體業(yè)務(wù)時(shí)的所有sf2內(nèi)部的調(diào)用給打印出來(lái),看一下具體時(shí)間都耗費(fèi)在什么上了,然后再去有的放矢的去做優(yōu)化。