1. 程式人生 > >PHP優化加速之Opcache使用總結(轉載)

PHP優化加速之Opcache使用總結(轉載)

invalid spa span php優化 根目錄 key RM 實時 php5

轉自 http://blog.csdn.net/why_2012_gogo/article/details/51134674

PHP優化加速之Opcache使用總結:

Opcache是一種通過將解析的PHP腳本預編譯的字節碼存放在共享內存中來避免每次加載和解析PHP腳本的開銷,解析器可以直接從共享內存讀取已經緩存的字節碼,從而大大提高PHP的執行效率。PS: 需要區別於Xcache機制,後續總結中會介紹其使用。

· 如何安裝

· 如何配置

· 如何使用

· 顯示分析

· 註意事項

一、如何安裝

在PHP 5.5.0及後續版本中,PHP已經將Opcache功能以拓展庫形式內嵌在發布版本中了,默認未開啟Opcache加速,需要開發人員在php.ini中添加或解註釋Opcache相關配置即可。對於之前的老版本,可以將Opcache作為PECL拓展庫進行安裝和配置,可以參考PHP拓展安裝及配置:

http://blog.csdn.net/why_2012_gogo/article/details/51120645

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的性能,通常在開發調試階段使用。如果就是想在生產環境開啟使用,那麽就必須做好安全限制工作。

好了,到這裏已經總結並介紹完了對於Opcache的使用,如需進一步優化底層,可以參看和修改源代碼,不過一般情況下不需要哦!

PHP優化加速之Opcache使用總結(轉載)