PHP 加速器標準量度
阿恆
PHP 是一種描述程式語言(scripting language),當執行一個 PHP 原始碼的時候:
- PHP 系統把原始碼載入內存
- 剖析原始碼並把它轉換成作業碼(一種可以被 PHP 系統執行的程式碼)
- 執行作業碼
- 釋放內存
每一次我們連結到伺服器下載頁面,伺服器執行一個或多個 PHP 程式,每一個程式每次都要重複以上三個步驟,這是描述程式語言一般的運作方式。除非我們正在進行系統開發或者除錯,否則我們很少會在系統運行期間不斷修改程式,不停重複上述的步驟顯然毫無意義,這就是 PHP 加速器發揮功能的時候。
加速器會把作業碼儲存在內存或者磁碟上,當執行同一個原始檔時,加速器會檢驗原始檔自從上次載入後有否更改過,沒有的話便直接執行儲存的作業碼,否則便按正常的步驟把原始碼載入、轉換、及執行。
部分加速器兼具優化作業碼的功能,例如把無用的迴圈、變量刪除,這對程式的執行效能有幫助。
jfbus 在他的網誌發表了一個加速器標準量度,針對三個 PHP 加速器進行測試:
- APC(開放原始碼)
- eAccelerator(開放原始碼,一個 Turck-MMCache 的分支版本)
- Zend Platform(商業軟件)
其實還有一個推出不久的加速器 xcache,不過 jfbus 這次沒有測試這個加速器,但他承諾會把這個加速器加入他下次的測試名單。
比較三者的支援程度
Zend Platform 是唯一有商業性支援的加速器,若果你需要良好的支援而又負擔得起,不妨考慮 Zend Platform。
eAccelerator 一度是個死專案,但現在他的維護者在更新程式碼的工作上幹得不錯,最新版本雖然被稱為 beta,但其實它正在很多伺服器上運作,事實上很多商業軟件的正式版本,其穩定性比開放原始碼軟件的 beta 版本更差。
APC 正在由幾個 PHP 的核心開發者開發,其中包括 Rasmus Lerdorf,即是 PHP 的發明人。計劃中 APC 將會是 PHP6 的預裝組件,它的前途顯然十分光明,有趣的是 eAccelerator 的使用者似乎比 APC 多,尋找 eAccelerator 的幫助時也比 APC 的容易。
比較 APC 和 eAccelerator 的效能
測試環境是:
- Xeon 2.8GHz(沒有 Hyper-Threading)
- 1 GB RAM
- Apache 2.0
- PHP 5.1.4
- eAccelerator 0.9.5-beta5(採用預設參數)
- APC 2.0.10(採用預設參數)
jfbus 先後執行三個程式:
- 一個簡單的 Hello World 程式
- 一個把 92KB 的物件載入及 de-serialize 的程式
- phpMyAdmin 的主程式,但是暫停聯繫數據庫的功能
量度每秒鐘的執行次數來衡量程式的執行效率,一個完全沒有使用加速器的數據會用來作為基準,測試的結果顯示:
- 程式越複雜,加速器的功效越明顯
- 程式的 I/O 越多,加速器的功效越不明顯
- eAccelerator 和 APC 的效能沒有明顯的差別
比較 APC 和 eAccelerator 對原始檔被修改的反應
這項測試只會執行 phpMyAdmin 的主程式,測試兩種情況:
- 在執行途中其中一個原始檔被修改
- 在執行途中所有原始檔都被修改
兩個加速器的表現這次很不同了,eAccelerator 在兩種情況下效能幾乎都沒有影響,但是 APC 則出現大幅下滑。若果你在一個很繁忙的網站修改程式,使用 APC 很顯然在自找麻煩。這項測試 eAccelerator 可說是技術性擊倒對手。
結論
加速器對提升 PHP 的效能有很大的好處,在繁忙的網站使用加速器甚至可說是必需的。不過加速器亦非萬應靈丹,寫得笨拙的程式在使用加速器後仍然是笨拙的程式,甚麼加速器都幫不上忙。
若果你要求正式的支援服務而又不介意付出一點金錢的話,Zend Platform 是一個好的選擇。
不是的話,選擇 eAccelerator 好了。
下一個版本的 APC 看來很不錯,jfbus 將會在下次測試的時候加入 xcache、Zend Optimizer 和下一個版本的 APC。