咱們先看一下 PHP 的執行過程:php
在 PHP-FPM 模式下,步驟 1 在啓動時執行一次,後續的請求中再也不執行;步驟 2 3 4每次請求都須要執行一遍。nginx
2 和 3 生成的語法樹和 Opcode ,同一個PHP 腳本每次運行的結果都是同樣的。web
而 OPcache 就是用來緩存 Opcode 的。緩存
OPCache 是 Zend 官方出品的,開放自由的 Opcode 緩存擴展,還具備代碼優化功能,省去每次加載和解析 PHP 腳本的開銷。bash
OPcache 經過將 PHP 腳本預編譯的字節碼存儲到共享內存中來提高 PHP 的性能, 存儲預編譯字節碼的好處就是 省去了每次加載和解析 PHP 腳本的開銷。php7
PHP5.5.0之後的版本已經默認包含了 OPCache 擴展。性能
OPCache 緩存的機制主要是:將 PHP 編譯產生的字節碼以及數據緩存到共享內存中,在每次請求,從緩存中直接讀取編譯後的 opcode,進行執行。優化
是緩存,都有過時時間。.net
OPCache 的更新策略很是簡單,到期數據置爲 Wasted,達到設定值,清空緩存,重建緩存。rest
由於在高流量的場景下,重建緩存是一件很是耗費資源的事情,因此建議:不要設置 OPcache 的過時時間。
每次發佈新代碼時,都會出現反覆新建緩存的狀況。如何避免呢?
opcache_compile_file()
進行編譯緩存由於PHP5.5.0 之後的版本都已經默認安裝了 OPCache,可是默認是沒有開啓的,須要手動開啓。
開發方法:編輯 php.ini
;開啓擴展 zend_extension=opcache.so [opcache] ;容許在 web 環境使用 opcache.enable=1 ;容許在 cli 環境使用 opcache.enable_cli=0
重啓 PHP-FPM 和 Nginx。
service php7.2-fpm restart service nginx restart
php.ini
的 OPCache 配置;容許在 web 環境使用 opcache.enable=1 ;容許在 cli 環境使用 opcache.enable_cli=1 ;OPcache 的共享內存大小,以兆字節爲單位。 opcache.memory_consumption=128 ;用來存儲預留字符串的內存大小,以兆字節爲單位 opcache.interned_strings_buffer=8 ;OPcache 哈希表中可存儲的腳本文件數量上限 opcache.max_accelerated_files=4000 ;檢查腳本時間戳是否有更新的週期,以秒爲單位。 設置爲 0 會致使針對每一個請求, OPcache 都會檢查腳本更新。若是 opcache.validate_timestamps 配置指令設置爲禁用,那麼此設置項將會被忽略。 opcache.revalidate_freq=60