
OPcache 與 PHP 效能調校
OPcache 是效益最大的單一設定
PHP 每次執行都要把原始碼編譯成中介碼。OPcache 把編譯結果存在記憶體中,後續請求直接使用,省下重複編譯的開銷。
對多數 PHP 網站而言,啟用 OPcache 是投入最少、效益最明顯的一項調整。
但要注意:它只解決編譯的開銷,不會加速你的資料庫查詢或程式邏輯。 若瓶頸在那裡,OPcache 的幫助有限。
基本設定
opcache.enable = 1 opcache.enable_cli = 0 opcache.memory_consumption = 256 opcache.interned_strings_buffer = 16 opcache.max_accelerated_files = 20000 opcache.validate_timestamps = 1 opcache.revalidate_freq = 2 opcache.save_comments = 1
各參數的意義
- memory_consumption——分配的記憶體,單位 MB。不足時會開始清除快取,效益下降
- max_accelerated_files——可快取的檔案數上限。應大於專案的實際 PHP 檔案數
- validate_timestamps——是否檢查檔案是否被修改
- revalidate_freq——檢查的間隔秒數
- save_comments——保留註解。若有套件依賴註解形式的標註,必須開啟,否則會出現難以理解的錯誤
怎麼確認設定夠不夠
用 opcache_get_status() 查看實際狀態,重點看三個數字:
| 指標 | 意義 | 判斷 |
|---|---|---|
| 記憶體使用率 | 已用 ÷ 總量 | 接近上限就該調高 |
| 快取檔案數 | 已快取 ÷ 上限 | 接近上限就該調高 |
| 命中率 | 命中 ÷ 總請求 | 應該很高,偏低代表快取一直被清 |
如果出現重啟次數持續累加,代表記憶體或檔案數不足,快取被反覆清空重建,效益大打折扣。
正式環境的兩種策略
策略一:保留時間戳檢查
opcache.validate_timestamps = 1 opcache.revalidate_freq = 60
檔案更新後最多 60 秒生效。適合會直接在伺服器上修改檔案的情況。
策略二:關閉時間戳檢查
opcache.validate_timestamps = 0
效能最好,但檔案更新後不會自動生效,必須在部署後手動清除快取或重載 PHP-FPM。
這是很多人踩過的坑:改了程式卻沒有變化,重載 PHP-FPM 之後才生效。
建議
- 有自動化部署流程——用策略二,並在部署腳本中加入重載
- 手動更新檔案——用策略一,避免忘記清快取
檔案快取
可額外把中介碼存到磁碟,讓重啟後不必重新編譯:
opcache.file_cache = /var/cache/opcache opcache.file_cache_only = 0
對重啟頻繁或有多台伺服器的環境有幫助。注意該目錄的權限與清理。
關於 JIT
PHP 8 引入的即時編譯功能。實務上要有正確的期待:
- 對數值運算密集的程式有明顯效益
- 對典型的網頁應用效益有限——因為瓶頸通常在資料庫與輸出入,不是 CPU 運算
- 可能增加記憶體用量與除錯的複雜度
opcache.jit_buffer_size = 64M opcache.jit = tracing
建議先測量再決定。 多數企業網站啟用 JIT 的效益不明顯,而 OPcache 本身的效益就很大了。
realpath 快取
容易被忽略但實際有效的一項:
realpath_cache_size = 4096k realpath_cache_ttl = 600
它快取檔案路徑的解析結果。對有大量 include 的框架型應用,效益明顯。
其他效能相關的設定
output_buffering = 4096 zlib.output_compression = Off
壓縮建議交給網頁伺服器處理,不要在 PHP 層做——伺服器層的實作通常更有效率,也比較好統一管理。
壓縮設定見網頁伺服器的效能相關設定。
資料庫連線
PHP 端可以考慮持久連線,但要謹慎:
- 可省下連線建立的開銷
- 但連線數會隨行程數累積,可能耗盡資料庫的連線上限
- 交易或暫存表未清乾淨時,可能影響下一個使用該連線的請求
多數情況不建議開啟,除非確認資料庫端的連線上限足夠且有明確效益。
調校的正確順序
- 先測量——確認瓶頸在哪,不要憑猜測調參數
- 啟用 OPcache 並確認命中率——這是效益最大的一步
- 檢查應用層——資料庫查詢、迴圈中的重複查詢、缺少索引
- 再考慮其他調整
第三項通常才是真正的瓶頸。 參數調到極致,也救不了一個在迴圈中查一千次資料庫的程式。
整體的效能排查見網站慢的常見原因與優先處理順序。
本文的設定與語法以 PHP 8.x 為例,實際的參數、預設值與支援狀態可能因版本與發行版而異。各版本的支援時程請以 PHP 官方公告為準。套用前請先在測試環境驗證,並確實備份原設定檔。