ScarShow

< IS >

使用 PHP OPCache 的正確姿勢

2019-05-29  /  IT  /  Note OPCache PHP

PHP OPCache 看起來很迷人,但有時會被它傷得滿身,有可能今早用起來好好的系統,下午就突然壞掉了。

人在江湖飄,哪能不挨刀?某天我就挨了好幾刀。

Trouble

基本上在生產環境開啟它是正確的選擇,對於效能上增進還是很不錯的,但凡事都有意外...例如無法強制清除快取。

問題是這樣子的,在某次部署之後,強制清除快取卻異常失效,快取的檔案版本不一致,導致網站異常。

所以又去看了原本的設定並且做了一且調整。

Config

下面是所有的設定,但有些設定還是要注意一下。

設定要注意一下,opcache.validate_timestamps 在開啟的時候 opcache.revalidate_freq 的時間檢查才會發揮作業。

但在生產環境上是推薦將 opcache.validate_timestamps 關閉,然後在部署成功之後再清除快取。

但因為有發生過無法強制清除快取的事件,所以在這邊折衷將 opcache.validate_timestamps 開啟讓 Opcache 去自動檢查並清除快取。

[opcache]
;opcache.enable=0
;opcache.enable_cli=0
;opcache.memory_consumption=64
;opcache.interned_strings_buffer=4
;opcache.max_accelerated_files=2000
;opcache.max_wasted_percentage=5
;opcache.use_cwd=1
;opcache.validate_timestamps=1
;opcache.revalidate_freq=2
;opcache.revalidate_path=0
;opcache.save_comments=1
;opcache.load_comments=1
;opcache.fast_shutdown=1
;opcache.enable_file_override=0
;opcache.optimization_level=0xffffffff
;opcache.inherited_hack=1
;opcache.dups_fix=0
;opcache.blacklist_filename=
;opcache.max_file_size=0
;opcache.consistency_checks=0
;opcache.force_restart_timeout=180
;opcache.error_log=
;opcache.log_verbosity_level=1
;opcache.preferred_memory_model=
;opcache.protect_memory=0

以下針對此次問題所調整的設定。

opcache.validate_timestamps=1
opcache.revalidate_freq=60

Clean Cache

清除快取的方式,必須在正確的行程中執行指令或是將行程重新啟動才能清除。

所以這邊要注意的是在 CLI 執行 opcache_reset() 是無法影響到 php-fpm 的。

<?php
opcache_reset();
service php-fpm reload

Reference