PHP使用Zend Opcache之優化加速和緩存清理總結


簡介

字節碼緩存不是php的新特性,有很多獨立性的擴展可以實現緩存,比如PHP Cache(APC),eAccelerator,ionCube和XCache等等。但是到目前為止,這些獨立的擴展並沒有集成到php核心當中。所有在php5.5.0之后,php內置了字節碼緩存功能,叫做Zend Opcache。

zend Opcache前身是Zend Optimizer +,在03年改名Opcache,通過opcode緩存和優化提供更快的PHP執行過程。他會將預編譯后的php文件存儲在共享內存中以供以后的使用,避免從磁盤讀取文件在進行解釋的重復過程,減少時間和內存的消耗。在php5.5中及之后的版本中自帶了zend opcache模塊擴展,但是需要使用時需要我們開啟和配置。在php5.2- 5.4版本我們也可以使用Opcache,但是需要我們自行安裝。

 

 

什么是操作碼緩存

那么什么是字節碼緩存呢?php是一門解釋型的語言,php解釋器執行php腳本時會解析php腳本代碼,將php腳本代碼編譯成一系列可以直接運行的中間代碼,也稱為操作碼(Operate Code,opcode)。然后執行這些操作碼.

每次請求php文件都是這樣,所以會消耗很多資源,如果每次HTTP請求PHP都必須解析,編譯和運行腳本,消耗的資源將會更多.

Opcode cache 的目地是避免重復編譯,減少 CPU 和內存開銷。需要注意的是如果動態內容的性能瓶頸不在於 CPU 和內存,而在於 I/O 操作,比如數據庫查詢帶來的磁盤 I/O 開銷,那么 opcode cache 的性能提升是非常有限的.

現代操作碼緩存器(Optimizer+,APC2.0+,其他)使用共享內存進行存儲,並且可以直接從中執行文件,而不用在執行前“反序列化”代碼。這將帶來顯着的性能加速,通常降低了整體服務器的內存消耗,而且很少有缺點.

 

 

安裝(php5.5.0以上跳過)

在PHP 5.5.0及之后版本中,PHP已經將Opcache功能以拓展形式內嵌在發布版本中了,默認未開啟Opcache加速,需要我們手動開啟。對於之前的老版本,可以將Opcache作為PECL拓展庫進行安裝和配置.

window下的安裝

1. 下載擴展:https://windows.php.net/downloads/pecl/releases/opcache/

2. 將php_opcache.dll放進php/ext目錄下

3. 修改php.ini下[php]配置(注意路徑要修改成你自己的):

[php]
engine = On
extension = php_opcache.dll
zend_extension = "c:/xxx/php/ext/php_opcache.dll"
4. 添加php.ini下的[opcache]配置:
[opcache] 
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
5. 重啟apache服務,檢查opcache是否開啟成功

 

linux下的安裝

源碼安裝

wget http://pecl.php.net/get/zendopcache-7.0.5.tgz
tar zxvf zendopcache-7.0.5.tgz
cd zendopcache-7.0.5
/path/to/php/bin/phpize
./configure --with-php-config=/path/to/php/bin/php-config
make && make install
在php.ini下的[php]添加如下配置:
zend_extension=php_opcache.so
在php.ini的[opcache]下添加:
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
pecl 版本安裝
yum install php-pecl-zendopcache
安裝時產生的 opcache 的配置文件位於默認的 /etc/php.d 目錄中:
opcache-default.blacklist 
opcache.ini
修改該配置:
vi /etc/php.d/opcache.ini  
對照修改:
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1
不需要修改php.ini,重啟apache服務.

 

常用配置

;開關打開
opcache.enable=1

;開啟CLI
opcache.enable_cli=1

;可用內存, 酌情而定, 單位為:Mb
opcache.memory_consumption=528

;Zend Optimizer + 暫存池中字符串的占內存總量.(單位:MB)
opcache.interned_strings_buffer=8

;對多緩存文件限制, 命中率不到 100% 的話, 可以試着提高這個值
opcache.max_accelerated_files=10000

;Opcache 會在一定時間內去檢查文件的修改時間, 這里設置檢查的時間周期, 默認為 2, 定位為秒
opcache.revalidate_freq=1

;打開快速關閉, 打開這個在PHP Request Shutdown的時候回收內存的速度會提高
opcache.fast_shutdown=1

;檢查腳本時間戳是否有更新的周期,以秒為單位。設置為 0 會導致針對每個請求, OPcache 都會檢查腳本更新。
opcache.revalidate_freq=0  

;如果啟用,那么 OPcache 會每隔 opcache.revalidate_freq 設定的秒數 檢查腳本是否更新。
;如果禁用此選項,你必須使用 opcache_reset() 或者 opcache_invalidate() 函數來手動重置 OPcache,也可以 通過重啟 Web 服務器來使文件系統更改生效。
opcache.validate_timestamps=0  
注意:如果設置opcache的opcache.validate_timestamps的指令設成0,那么zend opcache就察覺不到PHP腳本的變化,我們必須手動清空zend opcache緩存的字節碼,讓他發現php腳本的變動.這個設置適合在生產環境中設置成0,在開發環境下最好還是設置成1.

我們可以這樣配置,啟用自動重新驗證緩存功能:

opcache.validate_timestamps=1
opcache.revalidate_freq=0

更多的配置指令可以看這里:http://php.net/manual/zh/opcache.configuration.php

 

常用函數

zend opcache使用很簡單,因為它啟動后會自動運行.zend opcache會自動在內存中緩存預先編譯好的php字節碼,如果緩存了某個文件的字節碼,就執行對應的字節碼.常見的關於zend opcache擴展的函數:

opcache_compile_file($php_file); #預生成opcode緩存

opcache_is_script_cached($php_file) #查看是否生成opcode緩存

opcache_invalidate($php_file, true) #清除單個緩存

opcache_reset(); #清空緩存

opcache_get_status(); #獲取緩存的狀態信息

opcache_get_configuration(); #獲取緩存的配置信息

 

以上

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM