在網上無心中看到的一篇文章,這哥們很是簡潔地談論了zend opcache的最佳設置,他說他爲此花了大量的時間探索zend opcache的每一個設置選項的細節,甚至是閱讀它的源代碼,而且在本身的項目中實踐(一個天天有117 million的HTTP請求的應用)。php
Opcache優化在著名的《modern php》 中也有重要篇幅。在PHP文檔也有詳細介紹:http://php.net/manual/zh/opcache.configuration.php#ini.opcache.revalidate-freqhtml
我的以爲這種文章至關有指導意義,因此特意把它的設置方式摘譯以下(格式有些修改)。git
opcache.revalidate_freq
這個選項用於設置緩存的過時時間(單位是秒),當這個時間達到後,opcache會檢查你的代碼是否改變,若是改變了PHP會從新編譯它,生成新的opcode,而且更新緩存。值爲「0」表示每次請求都會檢查你的PHP代碼是否更新(這意味着會增長不少次stat系統調用,譯註:stat系統調用是讀取文件的狀態,這裏主要是獲取最近修改時間,這個系統調用會發生磁盤I/O,因此必然會消耗一些CPU時間,固然系統調用自己也會消耗一些CPU時間)。能夠在開發環境中把它設置爲0,生產環境下不用管,由於下面會介紹另一個設置選項。github
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。php-fpm
真實的取值是在質數集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一個比設置值大的質數。 設置值取值範圍最小值是 200,最大值在 PHP 5.5.6 以前是 100000,PHP 5.5.6 及以後是 1000000。
聽起來好複雜,但用下面的命令就妥啦post
你能夠運行 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
via: http://gywbd.github.io/posts/2016/1/best-config-for-zend-opcache.html