解決php載入慢的乙個辦法

2021-09-30 09:34:21 字數 1201 閱讀 4202

這幾天在測試我們目前的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、將檔案開頭的<?php行換成空行

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{}

這樣的**就會出錯了

注:後來又測了一下autoload方式,發現比打成乙個檔案慢很多,在只自動載入一兩個類的情況下,某個特定請求需要執行20ms左右,而打成乙個只需要5ms左右

注:這個方案最終壓力測試發現完全不靠譜,重壓情況下的效能極差,最終還是autoload比較好。

iis mysql慢 IIS 解決首次載入慢的問題

2 站點高階設定 advanced settings 預載入已啟用 prelaod enabled true 接著配置 配置編輯器 configuration editor 當站點啟動時自動訪問的網頁,以實現預載入 若要指定初始化期間要返回的靜態檔案的名稱,請將remapmanagedrequest...

tomcat慢的解決辦法

今天部署服務的時候發現時間要超久,誇張的達到了18分鐘,我就鬱悶了,看了下輸出,發現是卡在 log4j warn please initialize the log4j system properly.log4j警告的解決方法 configure logging for testing option...

IIS 7 5 第一次載入慢的 解決辦法

問題焦點 win2008r2,win7 下面iis部署的.net站點第一次載入比較慢。解決辦法 1.基本原理 在第乙個請求到達之前載入web應用程式,從而提高其 的響應性。通過主動載入和初始化所有依賴項 如資料庫連線 編譯asp.net 和載入模組 2表現為 通過預載入工作程序減少第乙個請求的響應時...