Zend Opcache 的最佳設定
在網上無意中看到的一篇文章,這哥們非常簡潔地談論了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檔案的總和。我的程式碼庫大概有6000個PHP檔案,所以我把這個值設定為一個素數7963。
真實的取值是在質數集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 }
中找到的第一個比設定值大的質數。 設定值取值範圍最小值是 200
,最大值在 PHP 5.5.6
之前是 100000
, PHP 5.5.6
及之後是 1000000
。聽起來好複雜,但用下面的命令就妥啦
你可以執行 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
在 php.ini
的設定
開發模式下推薦,直接禁用 opcache
擴充套件更好
opcache.revalidate_freq=0 opcache.validate_timestamps=1 opcache.max_accelerated_files=3000 opcache.memory_consumption=192 opcache.interned_strings_buffer=16 opcache.fast_shutdown=1
多臺機器叢集模式或者程式碼更新頻繁時推薦,可以兼顧效能,方便程式碼更新
opcache.revalidate_freq=300 opcache.validate_timestamps=1 opcache.max_accelerated_files=7963 opcache.memory_consumption=192 opcache.interned_strings_buffer=16 opcache.fast_shutdown=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