[TOC]
# 如何配置
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的性能,通常在開發調試階段使用。如果就是想在生產環境開啟使用,那么就必須做好安全限制工作。
http://blog.csdn.net/why_2012_gogo?viewmode=contents
- OAuth
- 簡介
- 步驟
- 單點登錄
- .user.ini
- 時間轉換為今天昨天前天幾天前
- 獲取ip接口
- 協程
- 概念
- yield-from && return-values
- 協程與阻塞的思考
- 中間件
- mysqli異步與php的協程
- 代碼片段
- pdo 執行的sql語句
- 二進制安全
- 捕捉異常中斷
- global
- 利用cookie模擬登陸
- 解析非正常json
- 簡單的對稱加密算法
- RSA 加密
- 過濾掉emoji表情
- 判斷遠程圖片是否存在
- 一分鐘限制請求100次
- 文件處理
- 多文件上傳
- 顯示所有文件
- 文件下載和上面顯示所有文件配合
- 文件的刪除,統計,存數組等
- 圖片處理
- 簡介
- 驗證碼
- 圖片等比縮放
- 批量添加水印
- beanstalkd
- 安裝
- 使用
- RabbitMQ
- 簡介
- debain安裝
- centos安裝
- 常用方法
- 入門
- 工作隊列
- 訂閱,發布
- 路由
- 主題
- 遠程調用RPC
- 消息中間件的選型
- .htaccess
- isset、empty、if區別以及0、‘’、null
- php各版本
- php7.2 不向后兼容的改動
- php中的各種坑
- php7改變
- php慢日志
- 郵件
- PHPMailer實現發郵件
- 驗證郵件地址真實性
- 文件下載
- FastCgi 與 PHP-fpm 之間的關系
- openssl 加解密
- 反射
- 鉤子方法
- 查找插件
- opcode
- opcache使用
- opcache優化
- 分布式一致性hash算法
- 概念
- 哈希算法好壞的四個定義
- php實現
- java實現
- 數組
- jwt
- jwt簡介
- 單點登錄
- phpize
- GeoIP擴展
- php無法獲得https網頁內容的解決方案
- homestead運行的腳本
- Unicode和Utf-8轉換
- php優化
- kafka
- fpm配置
- configure配置詳解