You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用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. 验证步骤确认问题

  1. 按照上面的方法更新黑名单规则为绝对路径。
  2. 清理磁盘缓存:删除/tmp/php下所有文件。
  3. 重启PHP-FPM:
    sudo systemctl restart php7.4-fpm
    
  4. 访问一次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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 18:37:49