1.概述
字節(jié)碼緩存不是PHP的新特性忆矛,有很多獨立的擴展可以實現(xiàn)舌剂,比如APC、eAccelerator和Xache等聊浅,但是截至目前這些擴展都沒有集成到PHP內(nèi)核餐抢,從PHP 5.5.0開始堵幽,PHP內(nèi)置了字節(jié)碼緩存功能,名為Zend Opcache弹澎。
什么是字節(jié)碼緩存?作用是什么努咐?
眾所周知苦蒿,PHP是解釋型語言,構(gòu)建在Zend 虛擬機之上渗稍,PHP解釋器在執(zhí)行PHP腳本時會解析PHP腳本代碼佩迟,把PHP代碼編譯成一系列Zend操作碼(opcode:http://php.net/manual/zh/internals2.opcodes.php,由于每個操作碼都是一個字節(jié)長竿屹,所以又叫字節(jié)碼报强,字節(jié)碼可以直接被Zend虛擬機執(zhí)行),然后執(zhí)行字節(jié)碼拱燃。每次請求PHP文件都是這樣秉溉,這會消耗很多資源,如果每次HTTP請求都必須不斷解析碗誉、編譯和執(zhí)行PHP腳本召嘶,消耗的資源更多。如果PHP源碼不變哮缺,相應的字節(jié)碼也不會變化弄跌,顯然沒有必要每次都重新生成Opcode,結(jié)合在Web應用中無處不在的緩存機制尝苇,我們可以把首次生成的Opcode緩存起來铛只,這樣下次直接從緩存取,豈不是很快糠溜?下面是啟用Opcode緩存之前和之后的流程圖:
2.啟用Opcache
默認情況下淳玩,Zend Opcache沒有開啟,需要我們在編譯時使用--enable-opcache指定啟用Zend Opcache诵冒。
編譯好PHP后還需要在php.ini中指定Opcache擴展路徑:
zend_extension=/path/to/opcache.so
一般而言PHP編譯成功后會顯示Zend Opcache擴展路徑凯肋,但如果想不起來,可以使用如下命令找到PHP擴展所在目錄:
php-config --extension-dir
更新php.ini后重啟PHP進程并查看是否啟用成功:
3汽馋、配置Zend Opcache
啟用Zend Opcache后還需要在php.ini中配置Zend Opcache侮东,下面是一份配置示例作為參考:
opcache.revalidate_freq=0 //檢查腳本時間戳是否有更新時間
opcache.memory_consumption=64 //Opcache的共享內(nèi)存大小,以M為單位
opcache.interned_strings_buffer=16 //用來存儲臨時字符串的內(nèi)存大小豹芯,以M為單位
opcache.max_accelerated_files=4000 //Opcache哈希表可以存儲的腳本文件數(shù)量上限
opcache.fast_shutdown=1 //使用快速停止續(xù)發(fā)事件 ```
#4悄雅、使用Zend Opcache
Zend Opcache使用起來很簡單,因為啟用之后它會自動運行铁蹈,Zend Opcache會自動在內(nèi)存中緩存預先編譯好的PHP字節(jié)碼宽闲,如果緩存了某個文件的字節(jié)碼,就執(zhí)行對應的字節(jié)碼。
如果php.ini中配置了opcache.validate_timestamps值為0容诬,需要小心娩梨,因為Zend Opcache將不能覺察PHP腳本的變化,必須手動清空Zend OPcache緩存的字節(jié)碼览徒,才能讓它發(fā)現(xiàn)PHP文件的變動狈定。這個配置適合在生產(chǎn)環(huán)境中設置為0,但在開發(fā)環(huán)境會帶來不便习蓬,我們可以在開發(fā)環(huán)境中這樣配置啟用自動驗證緩存功能:
`opcache.validate_timestamps=1
opcache.revalidate_freq=0`