thinkphp 6+ 的 .env 文件生效需满足:根目录存在 utf-8 无 bom 的 .env 文件,入口文件调用 dotenv::createunsafeimmutable()->load(),且配置文件中必须用 env('key', 'default') 方式读取,否则 .env 不起作用。

环境配置出错,八成是 .env 文件没起效,或者它被框架忽略了。 ThinkPHP 6+ 默认优先读取 .env,但这个“优先”是有前提的:文件必须存在、格式合法、且未被 php.ini 或 Web 服务器禁用相关函数(比如 getenv())。
为什么 .env 文件写了却没用?
不是所有环境都默认加载 .env。ThinkPHP 只在入口文件(如 public/index.php)中调用了 Dotenv\Dotenv::createUnsafeImmutable() 才会生效——而官方标准安装包已内置,但手动迁移或精简项目时容易删掉这行。
- 检查
public/index.php是否包含Dotenv\Dotenv::createUnsafeImmutable(...)->load();(或类似初始化逻辑) -
.env必须放在项目根目录(与composer.json同级),不能放在config/或public/下 - 确认文件编码为 UTF-8 无 BOM,Windows 记事本保存易带 BOM,会导致解析失败
- 如果使用 CLI 命令(如
php think route:list),需确保命令执行路径是项目根目录,否则getcwd()找不到.env
.env 里哪些键名会被框架识别?
ThinkPHP 不解析任意键名,只认 config/database.php 等文件中明确用 env('DB_HOST', '127.0.0.1') 这种方式读取的变量。常见可识别键包括:
-
APP_DEBUG=true→ 控制app.php中的debug配置 -
DB_TYPE=mysql、DB_HOST=127.0.0.1、DB_NAME=tp6→ 对应database.php里的env('DB_TYPE')调用 -
CACHE_TYPE=redis、REDIS_HOST=127.0.0.1→ 需在cache.php中显式调用env() - 自定义键如
ALIYUN_OSS_KEY=xxx不会自动注入,必须在业务代码中手动env('ALIYUN_OSS_KEY')
修改了 .env 但配置没变?缓存惹的祸
ThinkPHP 会把 .env 解析结果缓存进 runtime/config/,下次请求直接读缓存,跳过文件解析。开发中改了 .env 却不生效,大概率是缓存没清。
- 执行
php think clear:config清空配置缓存(推荐) - 手动删除
runtime/config/目录下所有文件 - 注意:生产环境禁止关闭
app.php中的'app_host_cache' => true,否则每次请求都重读.env,性能明显下降 - 如果用的是 Swoole 或 RoadRunner,进程常驻,改
.env后必须重启服务才能生效
最易被忽略的一点:当 .env 和 config/*.php 同时存在同名配置项时,.env 并非“覆盖”,而是“兜底”——只有 PHP 配置文件里写成 env('KEY', 'default') 的形式,才会用 .env 值;如果写死成 'key' => 'hardcoded',.env 就彻底失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











