thinkphp 6 需手动在 config/database.php 中用 think\facade\env::get() 读取 .env 的 database_* 变量并设默认值,且必须清除配置缓存才能生效。

ThinkPHP 6 如何从 .env 正确读取数据库配置
默认情况下,ThinkPHP 6 不会自动把 .env 里的 DATABASE_* 变量映射到数据库配置中——它只认 config/database.php 里的数组。直接在 .env 写 DATABASE_HOST=127.0.0.1 是无效的,除非你手动桥接。
必须在 config/database.php 中显式调用 Env::get()
ThinkPHP 的 Env 类不会自动注入配置项,得你自己拉取并赋值。常见错误是直接写 'hostname' => $_ENV['DATABASE_HOST'],但环境变量未加载或大小写不一致会导致空值或连接失败。
- 确保已启用
think-env扩展(TP6.0+ 默认内置,无需额外安装) - 在
config/database.php中使用think\facade\Env,不要用$_ENV或getenv() - 所有键名必须全大写,且与
.env中完全一致(包括前缀) - 记得给关键字段设默认值,避免环境缺失时抛出异常
// config/database.php
use think\facade\Env;
return [
'default' => 'mysql',
'connections' => [
'mysql' => [
'type' => 'mysql',
'hostname' => Env::get('DATABASE_HOST', '127.0.0.1'),
'database' => Env::get('DATABASE_NAME', 'thinkphp'),
'username' => Env::get('DATABASE_USERNAME', 'root'),
'password' => Env::get('DATABASE_PASSWORD', ''),
'hostport' => Env::get('DATABASE_PORT', 3306),
'charset' => 'utf8mb4',
],
],
];
为什么 config/database.php 修改后不生效?
ThinkPHP 会缓存配置,尤其是生产环境开启 app_debug = false 后,config:cache 命令生成的 runtime/cache/ 下的 PHP 缓存文件会覆盖你的修改。
- 开发阶段:执行
php think clear清除全部缓存,或删掉runtime/cache/目录 - 确认
.env文件位于项目根目录(和think文件同级),且没有 BOM 头 - 检查
.env中等号前后不能有空格:DATABASE_HOST=127.0.0.1✅,DATABASE_HOST = 127.0.0.1❌ - 如果用了多应用模式,注意配置路径是否为
app/config/database.php(非全局)
TP5.1 和 TP6 的差异点
TP5.1 的 Env 类在 think\Env 命名空间下,且需手动引入;TP6 改为 think\facade\Env,用法一致但命名空间不同。更关键的是:TP5.1 的数据库配置默认就支持从 .env 自动读取(只要键名匹配),而 TP6 彻底移除了该自动行为,必须手写 Env::get()。
- TP5.1 可简写为:
'hostname' => \think\Env::get('DB_HOST') - TP6 必须用:
'hostname' => \think\facade\Env::get('DATABASE_HOST') - TP6 不再识别
DB_*前缀,统一推荐用DATABASE_*保持语义清晰
最常被忽略的是缓存清理和键名大小写——改完 .env 和 database.php 却不清缓存,等于白改。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











