启用opcache file_cache时黑名单规则是否失效?PHP-FPM 7.4.3环境问题咨询
OPCache黑名单在启用file_cache时失效问题(PHP 7.4.3 + Ubuntu 20.04)
我来拆解你的问题,一步步给你分析原因和解决方案:
1. 先检查你的黑名单规则(大概率是根源问题)
OPCache的黑名单是基于脚本绝对路径进行前缀或通配符匹配的,而你opcache_blacklist.txt里的规则全是相对路径(比如*.php、test.php),根本匹配不到test.php的实际绝对路径(比如/var/www/html/test.php)。
修正黑名单规则:
- 把
opcache_blacklist.txt的内容替换成test.php的完整绝对路径,比如:/var/www/html/test.php - 如果要拉黑某个目录下所有PHP文件,就用绝对路径加通配符:
/var/www/html/*.php - 更新规则后,重启PHP-FPM,并且删除
/tmp/php下所有缓存文件(因为file_cache的磁盘缓存会跨进程重启保留)。
2. 为什么启用file_cache后黑名单好像“失效”了
当你开启opcache.file_cache且设置opcache.file_cache_fallback=0时,OPCache会完全切换到磁盘缓存模式,不再使用内存缓存。在PHP 7.4中存在一个已知的边缘情况:内存缓存下的黑名单检查是正常的,但磁盘缓存下的检查可能被跳过或处理错误——尤其是当你的规则本身无效(比如相对路径)时,这个问题会更明显。
状态指标的含义:
- 每次刷新
test.php时blacklist_misses加1,说明OPCache确实在检查黑名单,但你的脚本没匹配到任何规则(所以被算作黑名单查找的“未命中”)。 - 禁用
file_cache后num_cached_scripts变为0,这可能是个误导性现象。如果此时blacklist_misses还在增长,说明黑名单规则依然不匹配,只是内存缓存可能因为其他配置(比如opcache.validate_timestamps)或自动清理而没有保留缓存。
3. 验证步骤确认问题
- 按照上面的方法更新黑名单规则为绝对路径。
- 清理磁盘缓存:删除
/tmp/php下所有文件。 - 重启PHP-FPM:
sudo systemctl restart php7.4-fpm - 访问一次
test.php,然后查看OPCache状态:- 如果
blacklist_hits增加了1,说明规则生效了,脚本不会被缓存。 - 如果
num_cached_scripts依然增长,那大概率是PHP 7.4 OPCache磁盘缓存逻辑的bug。
- 如果
4. 问题 workaround(如果规则正确但问题依旧)
PHP 7.4已经停止官方支持,但如果你不得不使用它,且正确规则下黑名单在file_cache模式仍然失效:
- 禁用
opcache.file_cache,回到默认的内存缓存模式(这是OPCache最稳定可靠的使用方式)。 - 如果需要跨重启的持久化缓存,可以考虑使用PHP 7.4+支持的
opcache.preload替代file_cache,它和黑名单规则的兼容性更好。
内容的提问来源于stack exchange,提问作者shingo
相关产品推荐
相关产品推荐

