近期完成伺服器從 FreeBSD 4.10 升級至 6.1,並將 PHP 更新至 5.1.4、Apache 升級至 2.2 版。為進一步提升系統效能,決定對 PHP 進行深度優化。早年曾接觸 MMCache 與 eAccelerator,對後者印象深刻,故此次優化首選 eAccelerator。本文整理相關文檔與實戰經驗,供大家參考。
eAccelerator 是一套免費開源的 PHP 加速、優化、編譯與動態快取專案。它透過快取 PHP 代碼編譯後的 opcode,大幅提升腳本執行效率,最高可達 10 倍加速,同時降低伺服器負載。專案於 2004 年從 Turck MMCache 分支發展而來,後者由 Dmitry Stogov 開發,曾是極優秀的 PHP 記憶體快取加速系統。隨著 MMCache 長期停止更新、不支援 PHP 5.x,eAccelerator 繼承其核心代碼並持續維護,成為主流選擇。
eAccelerator 將編譯後的 PHP 代碼存入共享記憶體,請求到來時直接調用,省去重複編譯開銷。從建立共享記憶體到查找 opcode 皆在極短時間完成。對於無法存入共享記憶體的文件,可回退至磁碟快取。此外,eAccelerator 內建編碼器,可透過 encoder.php 將 PHP 代碼編譯為不可逆的二進制格式,保護原始碼安全,編譯後的代碼需在安裝 eAccelerator 的環境下執行。
eAccelerator 依賴共享記憶體 API,在 *nix 平台(Linux、FreeBSD、OpenBSD、Mac OS X、Solaris、AIX、HP-UX)表現最佳。雖有 Windows 版本,但本文專注 *nix 環境配置。
mod_php 或 fastcgi 模式安裝# 下載最新源碼包(以 0.9.5-beta2 為例)
wget https://eaccelerator.net/eaccelerator-0.9.5-beta2.tar.bz2
tar -jxvf eaccelerator-0.9.5-beta2.tar.bz2
cd eaccelerator-0.9.5-beta2
# 設定 PHP 安裝路徑(FreeBSD 預設 /usr/local)
export PHP_PREFIX="/usr/local"
$PHP_PREFIX/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=$PHP_PREFIX/bin/php-config
make && make install
eAccelerator 提供兩種載入模式,PHP extension 模式為常用方式:
; 載入擴展
extension="eaccelerator.so"
; 核心參數
eaccelerator.shm_size="16" ; 共享記憶體大小(MB)
eaccelerator.cache_dir="/tmp/eaccelerator" ; 磁碟快取目錄
eaccelerator.enable="1" ; 啟用加速
eaccelerator.optimizer="1" ; 啟用優化器
eaccelerator.check_mtime="1" ; 檢查文件修改時間
eaccelerator.debug="0" ; 關閉除錯
eaccelerator.log_file="/var/log/httpd/eaccelerator_log"
eaccelerator.filter="" ; 過濾規則(空為全部快取)
eaccelerator.shm_max="0" ; 最大快取文件大小(0=不限)
eaccelerator.shm_ttl="0" ; 快取存活時間(0=永久)
eaccelerator.shm_prune_period="0" ; 清理週期(0=不自動清理)
eaccelerator.shm_only="0" ; 是否僅用共享記憶體
eaccelerator.compress="1" ; 啟用壓縮
eaccelerator.compress_level="9" ; 壓縮等級(1-9)
注意:若 PHP 為 thread-safe 版本,請將zend_extension改為zend_extension_ts。
配置完成後,建立快取目錄並設定權限:
mkdir /tmp/eaccelerator
chmod 777 /tmp/eaccelerator
瀏覽 phpinfo() 頁面或執行 php -i,若輸出包含 with eAccelerator v0.9.5-beta2 字樣即表示成功。若同時安裝 Zend Optimizer,兩者可共存,輸出會同時顯示兩者版本資訊。
開啟 eaccelerator.debug=1 後,日誌會記錄快取命中情況:
EACCELERATOR hit: "/var/www/example.com/index.php"
EACCELERATOR hit: "/var/www/example.com/config.php"
...
eAccelerator 提供豐富的本地快取 API(基於共享記憶體,僅限 *nix),主要介面文件位於源碼包 doc/php/ 目錄:
cache.php、dasm.php、encoder.php、info.php、loader.php、session.php、shared_memory.php常用函數包括:
| 函數 | 說明 |
|---|---|
eaccelerator_put($key, $value, $ttl=0) | 存入快取,$ttl 為秒數,0 表永久 |
eaccelerator_get($key) | 讀取快取,過期或不存在回傳 NULL |
eaccelerator_rm($key) | 刪除指定快取 |
eaccelerator_gc() | 清理所有過期快取 |
eaccelerator_lock($key) / eaccelerator_unlock($key) | 分散式鎖機制,保證多進程同步 |
eaccelerator_cache_output($key, $code, $ttl) | 快取代碼輸出結果 |
eaccelerator_cache_result($key, $code, $ttl) | 快取代碼執行回傳值 |
eaccelerator_cache_page($key, $ttl) | 快取整頁輸出 |
eaccelerator_set_session_handlers() | 設定 Session 處理器至 eAccelerator |