Opcache是一種通過將解析的PHP指令碼先行編譯的位元組碼存放在共用記憶體中來避免每次載入和解析PHP指令碼的開銷,解析器可以直接從共用記憶體讀取已經緩衝的位元組碼,從而大大提高PHP的執行效率。PS: 需要區別於Xcache機制,後續總結中會介紹其使用。
· 如何安裝
· 如何配置
· 如何使用
· 顯示分析
· 注意事項
一、如何安裝
在PHP 5.5.0及後續版本中,PHP已經將Opcache功能以拓展庫形式內嵌在發布版本中了,預設未開啟Opcache加速,需要開發人員在php.ini中添加或解注釋Opcache相關配置即可。對於之前的老版本,可以將Opcache作為PECL拓展庫進行安裝和配置。
NOTE:
如果你使用 --disable-all 參數 禁用了預設擴充的構建, 那麼必須使用--enable-opcache 選項來開啟 Opcache。
二、如何配置
php.ini:
[opcache]
; 啟動作業碼緩衝
opcache.enable=1
; 針對支援CLI版本PHP啟動作業碼緩衝 一般被用來測試和調試
opcache.enable_cli=1
; 共用記憶體大小,單位為MB
opcache.memory_consumption=128
; 儲存臨時字串緩衝大小,單位為MB,PHP5.3.0以前會忽略此項配置
opcache.interned_strings_buffer=8
; 快取檔案數最大限制,命中率不到100%,可以試著提高這個值
opcache.max_accelerated_files=4000
; 一定時間內檢查檔案的修改時間, 這裡設定檢查的時間周期, 預設為 2, 單位為秒
opcache.revalidate_freq=60
; 開啟快速停止續發事件,依賴於Zend引擎的記憶體管理模組,一次釋放全部請求變數的記憶體,而不是依次釋放記憶體塊
opcache.fast_shutdown=1
;啟用檢查 PHP 指令碼存在性和可讀性的功能,無論檔案是否已經被緩衝,都會檢查作業碼緩衝,可以提升效能。 但是如果禁用了 opcache.validate_timestamps選項, 可能存在返回過時資料的風險。
opcache.enable_file_override=1
; 拓展庫so檔案關聯載入
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/opcache.so
NOTE:
上面列出的配置項是常用且重要的配置項,實際不止上面這些配置項。
三、如何使用
實際上,對於Opcache的使用,主要體現在其提供的幾個函數:
1、opcache_get_configuration;
形式:array opcache_get_configuration(void);
擷取設定的緩衝配置資訊,以數組形式返回配置資訊、黑名單及版本號碼。
2、opcache_get_status;
形式:array opcache_get_status(void);
擷取設定的緩衝狀態資訊。
3、opcache_invalidate;
形式:boolean opcache_invalidate (string);
該函數的作用是使得指定指令碼的位元組程式碼快取失效。如果force 沒有設定或者傳入的是 FALSE,那麼只有當指令碼的修改時間 比對應位元組碼的時間更新,指令碼的緩衝才會失效。
4、opcache_reset;
形式:boolean opcache_reset(void);
該函數將重設整個位元組程式碼快取。在調用 opcache_reset() 之後,所有的指令碼將會重新載入並且在下次被點擊的時候重新解析。
5、opcache_compile_file;
形式:boolean opcache_compile_file (string);
無需運行,就可以編譯並緩衝指令碼。
6、opcache_is_script_cached
形式:boolean opcache_is_script_cached (string);
判斷某個指令碼是否已經緩衝到Opcache。
下面我編寫一個PHP指令碼,囊括上面的幾個函數的封裝,這樣也方便日後對Opcache的維護和管理,具體如下:
<?php/** * 這個檔案是對opcache最佳化器的幾個 * 函數的封裝,作為一個工具指令碼使用 */if(!extension_loaded("ZendOpcache")) { echo "You do nothave the Zend OPcache extension loaded , please open it up,then retry!";}/** * 函數操作封裝類 * 數組形式的結果,會轉為json格式返回,不做顯示上的處理 * 這裡主要處理的是影響Opcache緩衝狀態的操作,對於查看 * Opcache各項指標的處理,可查看項目:opcache-status */class OpcacheScriptModel{ private $_configuration; private $_status; function __construct() { $this->_configuration =opcache_get_configuration(); $this->_status =opcache_get_status(); } // 擷取配置資訊 public function getConfigDatas(){ echo json_encode($this->_configuration); } // 擷取狀態資訊 public function getStatusDatas(){ echo json_encode($this->_status); } // 指定某指令檔位元組程式碼快取失效 public function invalidate($script){ return opcache_invalidate($script); } // 重設或清除整個位元組程式碼快取資料 public function reset() { return opcache_reset(); } // 無需運行,就可以編譯並緩衝指令碼 public function compile($file){ return opcache_compile_file($file); } // 判斷某個指令碼是否已經緩衝到Opcache public function isCached($script){ return opcache_is_script_cached($script); }}// 獲得對象function getOpcacheDataModel(){ // 初始化對象 $dataModel = NULL; if(NULL ==$dataModel) { $dataModel = new OpcacheScriptModel(); } return $dataModel;}?>
上面的指令碼工具比較簡單,一般可放在項目中或是單獨作為工具使用,需要時去解析編譯即可,其實下面的顯示分析開源項目,也是使用上面的API函數,只不過其將獲得資料以圖形化形式展示出來,這樣更加直觀,請繼續往下看。
四、顯示分析
我們知道PHP指令碼的執行機制是,解析器解析PHP指令檔,並將其解析為位元組碼資料,而Opcache最佳化器的作用就是緩衝被解析的位元組碼資料,做到直接從緩衝中讀取而不需要每次都重複PHP指令碼的載入和解析工作,所以對於Opcache的使用,我們一般只需要做兩件事兒:
1、使用Opcache最佳化器,加快PHP程式的執行速度;
2、通過Opcache各項指標參數,即時瞭解當前PHP程式的效能狀態;
那麼,我們如何去查看和分析當前的Opcache加速效果那?答案是可以使用下Github上開源的項目:https://github.com/rlerdorf/opcache-status
將下載下來的項目放入到當前的Web伺服器根目錄下,直接存取即可,先看效果:
從上面的及專案檔看出,該Opcache工具是一個簡化的GUI版本,使用它可以清楚瞭解和分析下面的內容:
1、緩衝使用方式、剩餘情況及記憶體浪費情況及比例;
2、緩衝的keys、剩餘的keys數;
3、快取命中數以及未命中數;
4、緩衝配置、狀態以及緩衝捕獲指令碼;
5、緩衝的指令檔,以視圖形式劃分直觀顯示;
好了,Opcache的可視化就說到這裡,下面看下幾項注意點。
五、注意事項
1、不建議Xcache和Opcache同時啟用PHP最佳化;
因為PHP 5.5.0及後續版本已經內嵌對Opcache的支援,所以PHP意識到其重要性,相對於Xcache等第三方的PHP最佳化器來說,使用Opcache會是更好的選擇。另外,兩者同時存在的話,會使Opcache的快取命中數大大降低,而且增加不必要的開銷。
2、不建議在開發過程中開啟Opcache
原因很明顯,開啟了Opcache之後,開發人員修改的內容不會立即顯示和生效,因為受到opcache.revalidate_freq=60的影響,所以建議在開發並測試之後,測試效能時再行開啟測試,當然,生產環境一直都要開著Opcache了哦。
3、不建議將Opcache指標設定太大
Opcache各項指標配置大小或是否開啟,需要結合項目實際情況需求及Opcache官方建議的配置,項目的實際情況分析,可結合上面第四部分的可視化緩衝資訊分析調整。
4、不建議長期使用老版本的Opcache
建議及時關注Opcache官網動態,即時瞭解其的bugs修複,功能最佳化及新增功能,以便更好的將其應用在自己的項目中。
5、不建議在生產環境中,將上面介紹的開源項目放入Web服務根目錄
原因很簡單,因為這個開源項目並未做訪問的限制和安全處理,也就是說凡是可以訪問外網的使用者,只要知道了訪問地址就可以直接存取,所以不安全。一般下,這個開源工具只是協助可視化分析PHP的效能,通常在開發調試階段使用。如果就是想在生產環境開啟使用,那麼就必須做好安全限制工作。