針對共享頻寬、資源受限的託管環境,作者從實務經驗總結三大「軟體層面」加速手段:程式碼優化、輸出壓縮、快取機制。雖然文中工具版本較舊(Zend Optimizer 1.0、mod_gzip 1.3.x、Zend Cache 早期版),但核心原理在現代 PHP 7/8 生態依然完全適用,只是工具鏈已演進。
PHP 執行流程:原始碼 → 詞法分析 → 編譯為 Opcode → Zend Engine 執行。Zend Optimizer 在「編譯為 Opcode」階段進行靜態分析與優化(常數摺疊、死碼消除、函數內聯等),產出更高效的 Opcode。
; php.ini
zend_optimizer.optimization_level=15
zend_extension="/usr/local/Zend/lib/ZendOptimizer.so"
重啟 Apache 後,phpinfo() 可見 Zend Optimizer 區塊。官方宣稱效能提升 30%~40%。
; php.ini
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
OPcache 不僅優化 Opcode,還將編譯結果共享於共享記憶體,避免重複編譯,效能遠超 Zend Optimizer。
mod_gzip (Apache 1.3) / mod_deflate (Apache 2.x) 在回應送出前壓縮 HTML、CSS、JS、XML 等文字內容。
# httpd.conf (mod_deflate 範例)
LoadModule deflate_module modules/mod_deflate.so
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css text/xml application/javascript application/json
DeflateCompressionLevel 6
# 排除已壓縮格式
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|zip|gz)$ no-gzip dont-vary
</IfModule>
壓縮比通常 3~10 倍,頻寬節省 70%~90%。
ob_gzhandler; php.ini
output_handler = ob_gzhandler
; 或單一腳本
ob_start("ob_gzhandler");
注意:不可與 zlib.output_compression = On 同時啟用,會導致雙重壓縮錯誤。且 ob_gzhandler 僅壓縮 PHP 動態輸出,靜態檔案仍需 Apache 模組處理。
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_comp_level 6;
mod_fastcgi,設定 AddHandler fastcgi-script .fcgi。ZendCache.so。| 層級 | 工具/技術 | 適用場景 |
|---|---|---|
| Opcode | OPcache (內建) | 所有 PHP 專案必開 |
| 資料/物件 | Redis / Memcached / APCu | Session、查詢結果、計算結果、鎖 |
| HTTP 回應 | Varnish / Nginx fastcgi_cache / Symfony HttpCache / Laravel Response Cache | 公開頁面、API 回應、靜態化 |
| 模板片段 | Twig/Blade 快取、Edge Side Includes (ESI) | 局部更新、個人化區塊隔離 |
| CDN 邊緣 | Cloudflare / AWS CloudFront / Akamai | 全球分發、DDoS 防護、WAF |
文中提到 Netscape Navigator 不支援 gzip 解壓。現代瀏覽器 (IE6+、所有主流現代瀏覽器) 均完整支援 Accept-Encoding: gzip, deflate, br。若仍需支援極舊環境,可透過 Vary: Accept-Encoding 讓 Proxy 快取區分版本,或在 Apache 設定 BrowserMatch 排除特定 UA。
「程式碼優化 → 傳輸壓縮 → 多層快取」三位一體的加速哲學歷久彌新。工具雖舊,道常在。現代開發者應熟練掌握 OPcache、Redis、Varnish/Nginx Cache、CDN 這套標準組合拳,並根據流量規模、業務特性靈活調整快取策略與失效機制。