字節碼緩存不是PHP的新特性,有不少獨立的擴展能夠實現,好比APC、eAccelerator和Xache等,可是截至目前這些擴展都沒有集成到PHP內核,從PHP 5.5.0開始,PHP內置了字節碼緩存功能,名爲Zend Opcache。php
開始以前,咱們先來看看什麼是字節碼緩存,以及字節碼緩存的做用是什麼。緩存
衆所周知,PHP是解釋型語言,構建在Zend 虛擬機之上,PHP解釋器在執行PHP腳本時會解析PHP腳本代碼,把PHP代碼編譯成一系列Zend操做碼(opcode:http://php.net/manual/zh/internals2.opcodes.php,因爲每一個操做碼都是一個字節長,因此又叫字節碼,字節碼能夠直接被Zend虛擬機執行),而後執行字節碼。每次請求PHP文件都是這樣,這會消耗不少資源,若是每次HTTP請求都必須不斷解析、編譯和執行PHP腳本,消耗的資源更多。若是PHP源碼不變,相應的字節碼也不會變化,顯然沒有必要每次都從新生成Opcode,結合在Web應用中無處不在的緩存機制,咱們能夠把首次生成的Opcode緩存起來,這樣下次直接從緩存取,豈不是很快?下面是啓用Opcode緩存以前和以後的流程圖:性能
字節碼緩存能存儲預先編譯好的PHP字節碼,這樣,下次請求PHP腳本時,PHP解釋器不用每次讀取、解析和編譯PHP代碼,直接從內存中讀取預先編譯好的字節碼,而後當即執行,這樣能省不少時間,極大提高應用的性能。spa
注:若是使用Windows開發環境,或者使用
brew
或apt-get
等命令安裝的PHP能夠略過編譯步驟。.net
默認狀況下,Zend Opcache沒有開啓,須要咱們在編譯時使用--enable-opcache
指定啓用Zend Opcache。debug
編譯好PHP後還須要在php.ini
中指定Opcache擴展路徑:code
zend_extension=/path/to/opcache.so
通常而言PHP編譯成功後會顯示Zend Opcache擴展路徑,但若是想不起來,能夠使用以下命令找到PHP擴展所在目錄:blog
php-config --extension-dir
注:若是你使用Xdebug,須要在
php.ini
中先加載Zend Opcache,再加載Xdebug。進程
更新php.ini
後重啓PHP進程並查看是否啓用成功:事件
啓用Zend Opcache後還須要在php.ini
中配置Zend Opcache,下面是一份配置示例做爲參考:
opcache.validate_timestamps=1 //生產環境中配置爲0 opcache.revalidate_freq=0 //檢查腳本時間戳是否有更新時間 opcache.memory_consumption=64 //Opcache的共享內存大小,以M爲單位 opcache.interned_strings_buffer=16 //用來存儲臨時字符串的內存大小,以M爲單位 opcache.max_accelerated_files=4000 //Opcache哈希表能夠存儲的腳本文件數量上限 opcache.fast_shutdown=1 //使用快速中止續發事件
注:後續咱們還會進一步介紹Zend Opcache的配置,PHP官網中列出了Zend Opcache的所有設置:http://ua2.php.net/manual/zh/opcache.configuration.php。
Zend Opcache使用起來很簡單,由於啓用以後它會自動運行,Zend Opcache會自動在內存中緩存預先編譯好的PHP字節碼,若是緩存了某個文件的字節碼,就執行對應的字節碼。
若是php.ini
中配置了opcache.validate_timestamps
值爲0,須要當心,由於Zend Opcache將不能覺察PHP腳本的變化,必須手動清空Zend OPcache緩存的字節碼,才能讓它發現PHP文件的變更。這個配置適合在生產環境中設置爲0,但在開發環境會帶來不便,咱們能夠在開發環境中這樣配置啓用自動驗證緩存功能:
opcache.validate_timestamps=1 opcache.revalidate_freq=0