Zend OPcache 最佳實踐配置

wenber發表於2020-04-11

在網上無意中看到的一篇文章, 這哥們非常簡潔地談論了 Zend Opcache 的最佳設定, 他說他為此花了大量的時間探索 Zend Opcache 的每個設定選項的細節, 甚至是閱讀它的原始碼, 並且在自己的專案中實踐(一個每天有 117 million 的 HTTP 請求的應用). 個人覺得這種文章相當有指導意義, 所以特地把它的設定方式摘譯如下.

opcache.revalidate_freq

    這個選項用於設定快取的過期時間 (單位是秒), 當這個時間達到後,  opcache 會檢查你的程式碼是否改變, 如果改變了 PHP 會重新編譯它, 生成新的opcode, 並且更新快取. 值為 "0" 表示每次請求都會檢查你的 PHP 程式碼是否更新(這意味著會增加很多次stat系統呼叫, 譯註: stat系統呼叫是讀取檔案的狀態, 這裡主要是獲取最近修改時間, 這個系統呼叫會發生磁碟I/O, 所以必然會消耗一些CPU時間, 當然系統呼叫本身也會消耗一些CPU時間). 可以在開發環境中把它設定為0, 生產環境下不用管, 因為下面會介紹另外一個設定選項.

opcache.validate_timestamps

    當這個選項被啟用(設定為1), PHP會在 opcache.revalidate_freq 設定的時間到達後檢測檔案的時間戳(timestamp).
    如果這個選項被禁用(設定為0), opcache.revalidate_freq 會被忽略, PHP 檔案永遠不會被檢查. 這意味著如果你修改了你的程式碼, 然後你把它更新到伺服器上, 再在瀏覽器上請求更新的程式碼對應的功能, 你會看不到更新的效果, 你必須得重新載入你的 PHP (使用 kill -SIGUSR2 強制重新載入).
    這個設定是不是有些蛋疼, 但是我強烈建議你在生產環境中使用, why?因為當你在更新伺服器程式碼的時候, 如果程式碼較多, 更新操作是有些延遲的, 在這個延遲的過程中必然出現老程式碼和新程式碼混合的情況, 這個時候對使用者請求的處理必然存在不確定性.

opcache.max_accelerated_files

    這個選項用於控制記憶體中最多可以快取多少個 PHP 檔案, 這個選項必須得設定得足夠大, 大於你的專案中的所有 PHP 檔案的總和. 我的程式碼庫大概有 6000PHP 檔案,所以我把這個值設定為一個素數 7963 (譯註: 不知道這哥們為什麼要設定這個數, 7963 也不是大於 6000 的最小素數), 你可以執行 "find . -type f -print | grep php | wc -l" 這個命令來快速計算你的程式碼庫中的PHP檔案數.

opcache.memory_consumption

    這個選項的預設值為 64MB, 我把它設定為 192MB, 因為我的程式碼很大. 你可以通過呼叫 opcachegetstatus() 來獲取 opcache 使用的記憶體的總量, 如果這個值很大, 你可以把這個選項設定得更大一些.

opcache.interned_strings_buffer

    這是一個很有用的選項, 但是似乎完全沒有文件說明. PHP 使用了一種叫做字串駐留 (string interning) 的技術來改善效能. 例如, 如果你在程式碼中使用了 1000 次字串 "foobar",PHP 內部只會在第一使用這個字串的時候分配一個不可變的記憶體區域來儲存這個字串, 其他的 999 次使用都會直接指向這個記憶體區域. 這個選項則會把這個特性提升一個層次.
    預設情況下這個不可變的記憶體區域只會存在於單個 php-fpm 的程式中, 如果設定了這個選項, 那麼它將會在所有的 php-fpm 程式中共享. 在比較大的應用中, 這可以非常有效地節約記憶體, 提高應用的效能.
    這個選項的值是以兆位元組 (megabytes) 作為單位, 如果把它設定為16, 則表示16MB, 預設是4MB, 這是一個比較低的值.

opcache.fast_shutdown

    另外一個很有用但也沒有文件說明的選項. 從字面上理解就是"允許更快速關閉". 它的作用是在單個請求結束時提供一種更快速的機制來呼叫程式碼中的析構器, 從而加快 PHP 的響應速度和 PHP 程式資源的回收速度, 這樣應用程式可以更快速地響應下一個請求. 把它設定為 1 就可以使用這個機制了.
opcache.revalidate_freq=0
opcache.validate_timestamps=0 (在開發環境可以把這一行註釋掉)
opcache.max_accelerated_files=7963
opcache.memory_consumption=192
opcache.interned_strings_buffer=16
opcache.fast_shutdown=1

原文連結: zend opcache 最佳配置

本作品採用《CC 協議》,轉載必須註明作者和本文連結

故地有明月, 何慕異鄉圓.

相關文章