2012-12-10 54 views
-2

注:這個問題有點長PHP:提高面向對象的類的加載時間

我有Service-Dao-Model結構如下基於PHP的系統:

Service Factory > Foo Service > Core Service > Abstract Service > Service Interface 
Dao Factory > Foo Dao > Core Dao > Abstract Dao > Dao 
Foo > Core Model > Abstract Model 

讓我解釋一下一點點地。我嘗試通過定義摘要&接口類中的抽象函數來首先集中代碼,然後在Core Service,Core Dao和Core Model中實現默認行爲。

然後,自定義函數被寫入Foo Service,Foo Dao和Foo Model。最後,服務工廠&道工廠負責創建對象在Factory Pattern

其他信息:所有課程均附有log4php對象__construct()

在目前的開發狀態下,我在初始化階段加載了大約65個PHP類。通過添加計時器(定時器爲microtime(true)),我發現PHP在加載類時花費了大部分時間(0.02119s),接下來是將DB結果集轉換爲對象值(0.00608s),最後是DB查詢時間(0.00223s)。無法相信類加載時間比數據庫查詢時間多10倍!

問題:如何提高裝載類的PHP初始化時間?

版本:PHP 5.2.16,通過MySQLi的PHP擴展

UPDATE eAccelerator在被預安裝在共享主機連接到MySQL 5.1服務器,本地主機! Zend Engine v2.2.0 with eAccelerator v0.9.6.1

p.s.代碼可以在需要時共享。

+1

你可能想考慮使用[xdebug](http://xdebug.org/)或[ XHProf的](https://github.com/facebook/xhprof)。有很多事情你可以改進*先*。另外,如果你還沒有,字節碼緩存(通過APC和朋友)將大大加快你的初始化階段。 – Charles

+0

您是否有eAccelerator或其他緩存機制? –

+0

@BenD沒有其他正在使用的緩存機制。將嘗試查看eAccelerator。 – Raptor

回答

0

我假設你正在使用某種類型的自動加載,如果類加載時間太慢。考慮類似Symfony的的APC類加載器的方法:

http://symfony.com/doc/current/components/class_loader.html https://github.com/symfony/ClassLoader

其背後的想法是,它在緩存APC的類路徑,因此包括自動加載路徑沒有遍歷每個請求。無論如何,我認爲如果實際的PHP加載速度比數據庫速度慢,甚至更多,如果它比ORM層速度慢,則會出現一些架構問題......從我的經驗來看,加載時間通常是另一種方式。 PHP的哪些部分特別慢。你可以使用的另一種方法也是symfony的一個想法,在這裏你有一個部署腳本,它在部署時將所有類合併到一個文件中,減少文件系統調用,但是我不知道在你的情況下這是否實際可行,速度提高。基本上每次你有一個文件系統操作它的死緩慢,所以儘可能避免它..

+0

感謝您的答案,但我沒有使用類的自動加載。我需要時創建該類,如果完成使用,則將其設置爲null。 – Raptor

+0

@ShivanRaptor掃管笏?你怎麼能把類設置爲null?你正在編寫你自己的垃圾回收器嗎? –

+0

取消設置我的意思是變量 – Raptor