當解釋器完成對腳本代碼的分析後,便將它們生成能夠直接運行的中間代碼,也稱爲操做碼(Operate Code,opcode)。Opcode cache的目地是避免重複編譯,減小CPU和內存開銷,OPcache 經過將 PHP 腳本預編譯的字節碼存儲到共享內存中來提高 PHP 的性能, 存儲預編譯字節碼的好處就是 省去了每次加載和解析 PHP 腳本的開銷。php
PHP執行代碼會通過以下4個步驟(zend) input(PHP代碼)->詞法分析 ->語法分析 ->opcode ->Zend engine- >output
增長opcache以後,會變成如下步驟:
html
PHP 5.5+之後內建了opcache,編譯安裝的時候--enable-opcache 就能夠了。 其它版本須要下載和編譯git
wget https://pecl.php.net/get/zendopcache-7.0.4.tgz tar xzf zendopcache-7.0.4.tgz cd zendopcache-7.0.4 /usr/local/bin/phpize ./configure --with-php-config=/usr/local/bin/php-config make && make install
[opcache] zend_extension=opcache.so
service php-fpm restart
opcache安裝成功github
opcache.enable=1 #開關 默認打開 opcache.enable_cli=1 # opcache.validate_timestamps=1 # 默認1 若是置爲1,則OPCACHE會自動檢測文件的時間戳(檢測週期爲revalidate_freq), opcache.memory_consumption=128 # 可用內存 單位M opcache.revalidate_freq=60 # 多少秒檢測下php文件是否變更 opcache.optimization_level=1 opcache.error_log=/opt/logs/php/php_opcache.log #opcache 錯誤日誌 opcache.log_verbosity_level =1 #將錯誤信息都導向 Web 服務器日誌.默認的只有致命錯誤(level 0) 或者錯誤(level 1)纔會被記錄. opcache.max_wasted_percentage=5 #「浪費」的內存達到此值對應的百分比,就會發起一個重啓調度 opcache.interned_strings_buffer=8 #interned string的內存大小 opcache.max_accelerated_files=4096 # 文件數量 opcache.max_file_size=0 #被cache的文件的最大size,單位bytes。0表示不限 opcache.fast_shutdown=1 #打開時可以使php在request shutdown時回收內 opcache.force_restart_timeout=30 #若是opcache處於非active狀態,當N秒後opcache將自動重啓
能夠根據圖形展現界面的效果去調整參數.緩存
典型的問題就是因爲opcache的緩存加速機制致使的代碼變動後沒法當即看到效果,因此在開發環境下能夠經過設置revalidate_freq
時間,或者更新代碼後重啓php-fpm.
我的以爲最好的方式仍是上傳更新代碼後,自動執行一個腳本,調用opcache_reset()
函數重置全部opcache緩存字節碼。服務器
<?php if (extension_loaded('Zend OPcache')) { var_dump(opcache_reset()); }
https://github.com/rlerdorf/opcache-status
https://github.com/PeeHaa/OpCacheGUI函數