必须删除runtime/config/目录并确保config/app.php中'app_debug' => false为布尔值,否则即使修改.env或配置文件,框架仍读取缓存的runtime/config/config.php而忽略新配置。

ThinkPHP6项目修改了.env或config/下的配置文件,执行php think clear或手动删了runtime目录后,新配置仍不生效,问题往往卡在缓存未真正清空或服务进程没释放旧配置内存——这不是重启Web服务器就能解决的,而是要分层确认哪一层缓存还锁着旧值。
先确认是不是框架配置缓存没清干净
执行php think clear默认只清runtime/cache、runtime/log、runtime/temp,但不会动runtime/config/。而ThinkPHP 6.x在APP_DEBUG=false时会把所有config/*.php合并写入runtime/config/config.php,这个文件一旦生成,后续请求就直接读它,不再解析原始PHP配置文件。
进入项目根目录,运行:
rm -rf runtime/config/
这一步必须做。如果runtime/config/config.php还存在,哪怕你改了database.php里的host,框架也永远读不到新值。
检查APP_DEBUG是否真关闭了
很多开发者以为在.env里写了APP_DEBUG=false就万事大吉,但ThinkPHP最终以config/app.php里的'app_debug' => false为准。只要这个值是true,所有配置缓存(包括config、route、view)都不会写入,也不会加载。
打开config/app.php,找到这一行:
'app_debug' => true,
把它改成false。注意:不是注释掉,也不是写成字符串"false",必须是布尔值false。
【改完必须删掉整个runtime/目录】——因为APP_DEBUG=true期间生成的缓存文件结构和false时不兼容,混在一起会导致框架解析失败或静默跳过。
验证PHP环境变量是否被覆盖
ThinkPHP读取.env的时机是在App初始化早期,但如果入口文件public/index.php顶部有define('APP_DEBUG', true),它会直接屏蔽.env里的一切配置——这是最高优先级,且不可覆盖。
打开public/index.php,把第一行
再检查vendor/topthink/framework/src/think/App.php里有没有硬编码的调试开关(极少见,但某些定制版会有),如有,必须同步清理。
清除OPCache让PHP重载新配置
步骤一:确认OPCache启用
php -i | grep opcache.enable
如果输出opcache.enable => On,说明字节码缓存开着。此时即使你删了runtime、改了.env、重启了Nginx,PHP仍在执行旧编译后的代码。
步骤二:强制刷新OPCache
在项目根目录下新建一个opcache-reset.php,内容只有一行:
用浏览器访问http://你的域名/opcache-reset.php(确保该文件可被Web用户执行)。
或者更稳妥的方式:登录服务器,执行命令
sudo systemctl restart php8.3-fpm(请按你实际PHP版本调整,如php8.1-fpm)
注意:单纯reload不生效,必须restart——reload只重载配置,不销毁已加载的OPCache字节码。
最后一步:检查runtime目录权限是否阻止写入新缓存
运行php think clear后,框架需要往runtime/config/里重新生成config.php。如果runtime/目录属主不是Web进程用户(比如是root),或权限不足(比如chmod 755 runtime),就会静默失败——没有报错,但config.php始终不出现。
执行:
ls -ld runtime
输出中第三列应该是www-data(Ubuntu)或nginx(CentOS)。如果不是,运行:
sudo chown -R www-data:www-data runtime
然后确认runtime目录权限是755,runtime/config是775:
chmod 755 runtime
chmod 775 runtime/config
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











