PHP 8.3 缓存清除不生效主因是 OPcache 仍执行旧字节码,需先通过 phpinfo() 和 php -i 验证 Web 与 CLI 的 OPcache 状态是否一致,再检查目标文件是否在 opcache_get_status() 缓存列表中,最后闭环执行 config:cache + opcache_reset() 或 reload php8.3-fpm。

因为 runtime/config.php 文件虽然被更新了,但 PHP 的 OpCache 仍缓存着它旧的编译字节码,框架 require 加载时实际执行的是 OpCache 里的老版本,不是磁盘上刚写入的新文件。
确认是不是 OpCache 在作怪
先验证是否真被 OpCache 锁定:
- 在 Web 页面中调用
phpinfo(),搜索opcache.enable和opcache.status,确认 Web 进程启用了 OpCache - 在命令行执行
php -i | grep opcache,对比 CLI 和 Web 的 OpCache 状态是否一致(常有不一致情况) - 临时加一行代码:
var_dump(opcache_get_status()['scripts'][realpath(config_path('app.php'))] ?? null);,看该配置文件是否在 OpCache 缓存列表中
必须按顺序操作才生效
单独删文件或跑 php think config:cache 都不够,得闭环处理:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 确保
config/app.php中'app_debug' => false已生效(且未被.env覆盖) - 执行
php think config:cache,生成新的runtime/config.php - 立即清理 OpCache:在控制器里调用
opcache_reset()(需 OpCache 配置允许),或更稳妥地重启 PHP-FPM:sudo systemctl reload php8.3-fpm(根据实际版本调整)
其他容易忽略的干扰点
即使 OpCache 清了,仍返回旧值,再检查这些:
-
runtime/目录权限不对,导致config:cache命令静默失败——执行后立刻ls -l runtime/config.php看文件修改时间是否更新 -
runtime/config.php内容有语法错误(比如用了 PHP 8.2 的特性,但当前 PHP 是 8.1),框架会静默 fallback 到原始配置加载逻辑,但可能漏读部分键 - 多环境部署时,Web 进程用户和 CLI 用户不同,
runtime/目录归属或 SELinux 上下文限制了读取权限
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










