改完 .env 没反应,主因是 CLI 下未加载或 runtime 缓存未清除:TP6/8 默认仅 Web 入口加载 .env,命令行需手动添加加载逻辑;必须执行 php think clear 或删除整个 runtime 目录;用 var_dump(Env::get('APP_DEBUG')) 验证是否生效,并注意 .env 格式、编码及权限。

先确认 .env 是否被正确加载
ThinkPHP 6/8 默认只在 Web 入口(public/index.php)中自动加载 .env,而命令行(如 php think migrate)默认不加载——这是最常被忽略的一点。
检查项目根目录下的 think 文件末尾是否添加了 CLI 加载逻辑:
- TP8 必须手动加:
if (PHP_SAPI === 'cli') { \Dotenv\Dotenv::createImmutable(__DIR__)->safeLoad(); } -
__DIR__要指向项目根目录(含app/、config/、composer.json),不是public/或vendor/ - 确保 .env 文件就在这个根目录下,命名是
.env(不是env或.env.txt)
清除 runtime 缓存(必须做)
ThinkPHP 把解析后的配置、模板、日志等都存在 runtime/ 目录下,改了 .env 不清它,框架永远读旧值。
- 执行命令:
php think clear(清 temp、cache、log 等基础运行时文件) - 若仍无效,直接删掉整个
runtime/目录(开发环境安全,重启后自动重建) - 特别注意:TP8 的字段结构缓存存在
runtime/schema/,有时也要一并删掉
验证是否真生效了
别只靠页面刷新或浏览器缓存判断,用代码直查:
立即学习“PHP免费学习笔记(深入)”;
- 在控制器里写:
var_dump(\think\facade\Env::get('APP_DEBUG'));,看输出是否是你刚改的值 - 如果返回
null,说明 .env 没加载;如果返回旧值,说明缓存没清干净 - TP8 还要留意 OpCache:修改了 PHP 文件(包括 .env 解析逻辑)后,可能需重启 PHP-FPM 或执行
opcache_reset()
格式和权限别踩坑
.env 写法看着简单,但错一个空格就失效:
- 必须是
KEY=VALUE格式,等号两边不能有空格(APP_DEBUG = true❌) - 含空格或特殊字符的值要用引号包裹:
APP_NAME="My Project" - 文件编码为 UTF-8 无 BOM;Linux/macOS 权限建议
644;Windows 下注意别被系统加了隐藏扩展名



















