本篇文章更新時間:2023/06/15
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
這事件一開始是在一台 Oracle 的 Arm 主機上發生。網站莫名的會 502,沒有在 php_error.log
裡留下任何記錄,再來也只有「單一站」會這樣!該主機上的其他網站都沒事,實在詭異。
原本以為是 Oracle 的網路問題,但隨著這陣子開始升級不少主機的 PHP 版本到 8.0 後,這個 502「症狀」開始明確。
由於只要 reload/restart 一次設定這問題就會消失,就往「快取」這個方向來找。
想破頭之餘才聯想到可能是 OPcache 這個 PHP 快取的 extension,不過網路上找到有人分享的經驗居然就一篇!連我都還在懷疑這個方向是否正確XD
但往這方向去追,還真的發現 PHP 8 有針對 OPcache 增加一個最佳化的方法「jit」,與先前 PHP 7.4 沒問題的狀態一比,多了這個設定似乎可能是造成問題的可能。
目前給他先關閉這個功能來實驗看看了!
下方筆記針對 OPcache 的相關資訊與方法:
- opcache_get_configuration() 查看當前 OPcache 的組態設定。
- opcache_get_status(bool $include_scripts = true) 查看當前快取的狀態。
opcache.validate_timestamps
建議正式環境關閉此設定(設為0)這樣可以等部署好後才一次清除快取,如果有打開設定,opcache.revalidate_freq
的「清除頻率」才會有作用,上線環境也是給他關閉(設為0),減少使用一些 CPU 資源。opcache.max_accelerated_files
這個參數的值要搭配實際上專案裡的程式碼檔案數量,可以用指令:find . -type f -print | grep php | wc -l
來算一次,抓多一點來設定。opcache.memory_consumption
先透過觀察上面提到的opcache_get_status()
方法來觀察記憶體的使用量,再來這個設定去把專案會用到的記憶體空間給加大,單位是 MB。opcache.interned_strings_buffer
快取 interned 字串的大小設定,也是可以透過上述方法觀察來調整,單位是 MB。