跳至主要內容
問題與解答
OPcache 與 PHP 效能調校

OPcache 與 PHP 效能調校

問:
OPcache 要怎麼設定? 改了程式為什麼沒有生效? JIT 要開嗎? 效能調校要從哪裡開始?
答:

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 端可以考慮持久連線,但要謹慎:

  • 可省下連線建立的開銷
  • 但連線數會隨行程數累積,可能耗盡資料庫的連線上限
  • 交易或暫存表未清乾淨時,可能影響下一個使用該連線的請求

多數情況不建議開啟,除非確認資料庫端的連線上限足夠且有明確效益。

調校的正確順序

  1. 先測量——確認瓶頸在哪,不要憑猜測調參數
  2. 啟用 OPcache 並確認命中率——這是效益最大的一步
  3. 檢查應用層——資料庫查詢、迴圈中的重複查詢、缺少索引
  4. 再考慮其他調整

第三項通常才是真正的瓶頸。 參數調到極致,也救不了一個在迴圈中查一千次資料庫的程式。

整體的效能排查見網站慢的常見原因與優先處理順序

本文的設定與語法以 PHP 8.x 為例,實際的參數、預設值與支援狀態可能因版本與發行版而異。各版本的支援時程請以 PHP 官方公告為準。套用前請先在測試環境驗證,並確實備份原設定檔。

發表於2026-08-05   更新於2026-08-20
免費諮詢 · 1 個工作天內回覆

準備好讓網站 開始幫你帶生意了嗎?

不論是要做新網站、救舊網站,還是只想先聊聊方向——先諮詢,不用先付錢,我們照實給你建議。

1 個工作天回覆免費諮詢與報價費用白紙黑字26 年找得到人
免費諮詢
免費諮詢 LINE諮詢 03-4020420 臉書傳訊
免費諮詢 LINE諮詢 03-4020420 臉書傳訊
免費諮詢
免費諮詢 LINE諮詢 03-4020420 臉書傳訊
免費諮詢 LINE諮詢 03-4020420 臉書傳訊