使用 PHP OPCache 的正確姿勢
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