什麼是 Opcache,如何使用 Opcache

做冷欺花發表於2020-09-27

Opcode 是啥?

我們先看一下 PHP 的執行過程:

  1. PHP 初始化執行環節,啟動 Zend 引擎,載入註冊的擴充套件模組。
  2. 初始化後讀取 PHP 指令碼檔案,Zend 引擎對 PHP 檔案進行詞法分析,語法分析,生成語法樹。
  3. Zend 引擎編譯語法樹,生成 Opcode
  4. Zend 引擎執行 Opcode,返回執行結果。

在 PHP-FPM 模式下,步驟 1 在啟動時執行一次,後續的請求中不再執行;步驟 2 3 4每次請求都需要執行一遍。

2 和 3 生成的語法樹和 Opcode ,同一個PHP 指令碼每次執行的結果都是一樣的。

OPcache 就是用來快取 Opcode 的。

OPcache

OPCache 是 Zend 官方出品的,開放自由的 Opcode 快取擴充套件,還具有程式碼優化功能,省去每次載入和解析 PHP 指令碼的開銷。

OPcache 通過將 PHP 指令碼預編譯的位元組碼儲存到共享記憶體中來提升 PHP 的效能, 儲存預編譯位元組碼的好處就是 省去了每次載入和解析 PHP 指令碼的開銷。

PHP5.5.0以後的版本已經預設包含了 OPCache 擴充套件。

OPCache 快取的機制主要是:將 PHP 編譯產生的位元組碼以及資料快取到共享記憶體中,在每次請求,從快取中直接讀取編譯後的 opcode,進行執行。

OPcache 的更新策略

是快取,都有過期時間。

OPCache 的更新策略非常簡單,到期資料置為 Wasted,達到設定值,清空快取,重建快取。

因為在高流量的場景下,重建快取是一件非常耗費資源的事情,所以建議:不要設定 OPcache 的過期時間

每次釋出新程式碼時,都會出現反覆新建快取的情況。如何避免呢?

  • 不要在高峰期釋出程式碼,這是任何情況下都要遵守的規則
  • 程式碼預熱,比如使用指令碼批量調 PHP 訪問 URL,或者使用 OPCache 暴露的 API 如 opcache_compile_file() 進行編譯快取

Opcache 的安裝

因為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

其他引數檢視官網文件

參考

  1. PHP 官方 OPcache 擴充套件文件

  2. Opcode 是啥以及如何使用好 Opcache

  3. PHP OPcache工作原理

相關文章