這幾天在測試我們目前的php架構時發現,架構層載入php檔案的時間很長,最終發現是因為各種require_once導致整個載入時間變長,如果不使用eaccelerator的情況下,在虛擬機器上測試可能會到50-60ms,使用了ea之後,可以降到10-20ms,但是這個消耗還是比較大的,有什麼辦法可以解決嗎?
正好這兩天看到hiphop的文章,所以決定使用它來試一下,最終發現代價太大了,修改一個檔案要把整個工程全部編譯一次,並且它產生的程式是http協議的,我們現在只是需要一個fastcgi伺服器就行了,而且自己寫的各種擴充完全無法使用了,所以這條路基本上否定了。
雖然hiphop這條路走不通,但是卻給我一個啟示,既然造成載入慢的原因是require_once導致的,那乾脆寫個指令碼,把目前的所有代碼都merge成一個大的檔案不就行了(因為我們的架構是rpc的,因此只有一個入口,index.php,其他的代碼裡全是class和function,不存在直接的調用邏輯,因此merge以後不會有任何影響)。具體的操作如下:
1、將所有的require_once行刪除,換成|空行
2、將檔案開頭的
3、記錄每個檔案在merge後的檔案裡的offset,將這個資訊輸出在merge後的檔案尾,這個是用於修正日誌的,因為merge完了之後,日誌列印出來的資訊都是那個merge完的檔案以及行數,這對於線下查日誌沒有任何協助,因此需要修改日誌輸出類,根據merge後的行數對日誌進行修正。
做完之後,實際測了一下,發現如果不使用ea的話,架構的消耗基本在3-5ms,如果使用了ea,反而在5-6ms,去看了一下ea的代碼,發現原來它是將解析出來的op_array經過分類儲存,然後每次調用zend_compile時,再把這些東西重新拷貝再返回,這個過程並不比zend_compile實際去編譯快,而且還有許多額外的檢查,因此反而不如直接使用php-cgi。
另外在測試時發現php一個很奇怪的現象
class A extends B
{
}
class B{}
這段代碼是可以的,
但是
class A extend B{}
class B extend C{}
class C{}
這樣的代碼就會出錯了www.2cto.com
註:後來又測了一下autoload方式,發現比打成一個檔案慢很多,在只自動載入一兩個類的情況下,某個特定請求需要執行20ms左右,而打成一個只需要5ms左右
摘自 無心雲
http://www.bkjia.com/PHPjc/478485.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/478485.htmlTechArticle這幾天在測試我們目前的php架構時發現,架構層載入php檔案的時間很長,最終發現是因為各種require_once導致整個載入時間變長,如果不使用...