今兒在azure裏裝php5.5.4得瑟,發現原先php5.4、php5.3中的zend guard laoder以及php5.2中的Zend Optimizer均不能再用,一直很喜歡用的eaccelerator也悲劇了,編譯的時候直接提示錯誤。 php
沒辦法,翻看php5.5.4的安裝目錄,發現php的安裝目錄下的擴展庫目錄有個opcached.so;咦,這個文件是搞毛線的?看名字帶cached,難道是個緩存系統?google了下,果不其然,這個是php5.5默認提供的php腳本緩存擴展,編譯php5.5時加上參數--enable-opcache就能夠編譯opcache了,只是要啓用的話必須配置。 html
1、PHP中opcache的安裝、加速效果與配置介紹 linux
通過測試,php5.4、php5.3乃至php5.2也是可使用opcache模塊的,參考網絡上的測試文章(http://www.cnblogs.com/xiaocen/p/3709850.html)發現:zend opcache(通常就直接簡稱爲opcache了)的加速效率高於xcache,天然也就高於一年多不維護的eaccelerator了。另外,個人測試發如今php5.4上加載了eaccelerator加速擴展後,PHP代碼中使用複雜調用preg_replace_callback函數的代碼段後會引發嚴重的內存溢出(memory leak);而preg_replace函數在php5.5已經再也不建議使用,而是改用preg_replace_callback代替,從這個層面來講,棄用eaccelerator是一個明智的選擇。 nginx
低於PHP5.5版本的php要安裝opcache也很簡單,下載zend opcache(http://pecl.php.net/package/ZendOpcache),好比下載zendopcache-7.0.3.tgz,那麼編譯安裝就很簡單了,代碼以下: apache
1. tar zxvf zendopcache-7.0.3.tgz 緩存
2. cd zendopcache-7.0.3 服務器
3. phpize 網絡
4. #若環境變量未加入phpize的路徑 函數
5. #則執行phpize命令時須要加上路徑 加環境變量具體請參考 http://blog.jjonline.cn/linux/165.html php-fpm
6. #如你的php安裝在 /usr/local/php下,那麼此處應該輸入
7. #/usr/local/php/bin/phpize
8. ./configure
9. #同理,php安裝目錄下的bin目錄以及sbin目錄沒有加入環境變量的話就須要加上參數
10. #--with-php-config=/usr/local/php/bin/php-config #路徑依據具體路徑
11. make && make install
12. #make install 後會提示編譯出的opcache.so文件的位置,在php.ini加上相關配置段便可
參考網絡上的關於opcache的介紹:新一代PHP加速器,由Zend公司研發,其實現原理與Xcache相似,都是把PHP執行後的數據緩衝到內存中從而避免重複的編譯過程,可以直接使用緩衝區已編譯的代碼從而提升速度,下降服務器負載,但性能卻比Xcache更加優越,詳見下方測試結果圖。其機理簡單點說就是將php腳本在虛擬機(暫且稱php最終的機器碼執行引擎爲虛擬機吧)中的機器碼或相應的服務器可以直接運行的代碼給緩存起來,等到用戶下次請求該腳本時就略過了php腳本代碼轉換爲機器碼的過程,從而達到加速php運行、起到緩存的效果。
如何配置啓用opcache呢?
1. zend_extension = 「__Dir__opcached.so」
2. opcache.force_restart_timeout=3600
3. opcache.memory_consumption=1024
4. opcache.optimization_level=1
5. opcache.interned_strings_buffer=8
6. opcache.max_accelerated_files=4096
7. opcache.revalidate_freq=60 ;檢測php文件變更頻率 單位秒 多少秒檢測下php文件是否變更
8. opcache.fast_shutdown=1
9. opcache.enable=1
10. opcache.enable_cli=1
11. #配置中的__Dir__請更換成opcached.so文件的存放位置
opcache的緩存代碼塊是可使用內存的,具體依據配置參數而定;再也不多介紹。
opcached.so被加載後,全部腳本執行時經過phpinfo就能夠看到高速緩存的命中率,以下圖中的Cache hits是12,而Cache misses爲1
那麼這個高速緩存如何被清理呢?依然經過配置文件配置,具體項目就是opcache.force_restart_timeout,經過指定該時間,在多少時間內容該緩存失效。
看到本文過來的關鍵詞,有人在問如何關閉opcache,其實很簡單,配置文件中將相關引入opcahe擴展的配置項註釋掉便可(php配置文件中的註釋可使用英文分號,即在相關opcache的配置項行首位置加入英文分號,而後保存,重啓apache或php-fpm便可)。
2、啓用opcache後的一些狀況
典型的就是因爲opcache的緩存加速機制致使的代碼變動後沒法當即看到效果。php代碼被轉換成可當即執行的「機器碼」後會有必定的緩存時間後纔會去檢查原始的PHP文件是否變更過,具體視配置項opcache.revalidate_freq設置的秒數狀況而定;這樣就會致使某些狀況下明明更新了PHP文件中的代碼,但執行後卻看不到改變後的效果,這就是由於opcache檢查php文件變更的間隔時間還沒有結束所致使。
這個問題並非bug,而要視具體生產環境來設定opcache.revalidate_freq值,假若php代碼不多變更,建議該值設置的大一些,可減小opcahce因爲檢查php文件變更而帶來的額外開銷,好比7200
那麼在變更php文件後如何才能快速下降opcache緩存帶來的這種問題呢?最簡單的方法就是更新代碼後重啓下php-fpm(nginx fast-cgi模式)或apache(apache-handler模式)。