ThinkPHP 开启 OPcache 后代码更新不生效,核心原因往往是 OPcache 默认配置 opcache.revalidate_freq=60 导致脚本修改后最多延迟 60 秒才被检测更新,而非代码逻辑错误。
原因分析
OPcache 将编译后的字节码存储在共享内存中,若 opcache.validate_timestamps=0,PHP 将永远不检查文件修改时间。此外,ThinkPHP 6 默认使用 file 驱动缓存,若 runtime/cache 目录权限不足或配置被覆盖为 null,也会导致数据不更新。
解决方案
1. 调整 OPcache 验证频率(推荐开发环境)
找到 OPcache 配置文件,例如 /usr/local/php/conf.d/004-opcache.ini,将 opcache.revalidate_freq 从默认的 60 改为 0。若无法修改 php.ini,可在 ThinkPHP 入口文件 public/index.php 顶部添加 ini_set('opcache.revalidate_freq',0);。
2. 清除框架层缓存
仅清 OPcache 不够,需执行 php think cache:clear。若手动删除 runtime/cache/ 无效,检查是否因 Docker 容器内目录属 root 导致权限拒绝(Permission denied)。
3. 重启或重载 PHP 服务
执行 service php-fpm reload 比重启更平顺,避免请求中断。若使用 CLI 清除,需确保 opcache.enable_cli=1 否则 opcache_reset() 无效。
注意事项
1. 权限校验:默认 opcache.validate_permission=0,修改文件权限后需设为 1 并重启服务。
2. 路径一致性:OPcache 按绝对路径索引,避免使用相对路径 include,可通过 opcache_get_status()['scripts'] 确认脚本是否在缓存列表。
3. 配置覆盖:检查 config/app.php 是否有 'cache' => [] 覆盖项,会导致 cache.php 配置失效。
参考来源
来源:CSDN 博客 - 解决 PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题(2020 年 12 月 30 日)
来源:技术社区 - ThinkPHP 缓存驱动失效导致数据不更新的清理与配置修正(2026 年 4 月 17 日)
来源:运维笔记 - 如何解决 PHP opcache 不生效问题(2021 年 12 月 16 日)