ThinkPHP的.env不支持Laravel式的[database]分组语法,必须使用DB_*全大写下划线格式的扁平键值对;多数据库需通过config/database.php硬编码或自定义前缀+手动组装实现,并务必清除配置缓存。

ThinkPHP 的 .env 里没有 database 分组概念
ThinkPHP 不支持像 Laravel 那样在 .env 中用方括号定义配置分组(如 [database])。它的 .env 是纯键值对格式,所有配置项必须扁平化写成 KEY=VALUE 形式,且 KEY 全大写、用下划线分隔。
你如果照搬 Laravel 的写法:
[database]<br> DB_HOST=127.0.0.1
ThinkPHP 会直接忽略 [database] 这一行,甚至可能因解析失败导致后续配置加载异常。
正确的数据库配置写法:用 DB_* 前缀 + 全大写 + 下划线
ThinkPHP 5.1+ 默认识别以下标准前缀的环境变量,对应数据库连接参数:
-
DB_TYPE:驱动类型,如mysql、pgsql、sqlsrv -
DB_HOST:数据库地址 -
DB_PORT:端口,默认3306 -
DB_NAME:数据库名 -
DB_USER:用户名 -
DB_PWD:密码 -
DB_PREFIX:数据表前缀(可选) -
DB_CHARSET:字符集,默认utf8mb4
示例 .env 片段:
APP_DEBUG = true DB_TYPE = mysql DB_HOST = 127.0.0.1 DB_PORT = 3306 DB_NAME = myapp DB_USER = root DB_PWD = 123456 DB_PREFIX = tp_ DB_CHARSET = utf8mb4
注意:DB_PWD 如果含特殊字符(如 $、#、空格),需用单引号包裹:DB_PWD = 'p@ss#word$',否则 shell 解析会出错。
多数据库配置不能靠 .env 分组,得靠配置文件或动态注册
ThinkPHP 的 .env 本身不支持多套数据库配置。如果你需要「主库 / 从库」或「业务库 / 日志库」,不能写成:
[database.master] DB_HOST=... [database.slave] DB_HOST=...
这完全无效。可行方案只有两个:
- 在
config/database.php中硬编码多个连接配置,通过Db::connect('slave')显式调用 - 在
.env中用自定义前缀(如DB_SLAVE_HOST),然后在config/database.php里读取并组装第二个配置数组
例如,在 .env 加:
DB_SLAVE_HOST = 192.168.1.100 DB_SLAVE_NAME = myapp_log DB_SLAVE_USER = loguser DB_SLAVE_PWD = 'logpass'
再在 config/database.php 里补充:
'slave' => [
'type' => env('DB_TYPE', 'mysql'),
'hostname' => env('DB_SLAVE_HOST', '127.0.0.1'),
'database' => env('DB_SLAVE_NAME', ''),
'username' => env('DB_SLAVE_USER', ''),
'password' => env('DB_SLAVE_PWD', ''),
// ...其他字段
],
修改后记得清空配置缓存
ThinkPHP 会把 .env 解析结果和配置文件合并后缓存到 runtime/cache/。改完 .env 后不清理,旧配置仍生效:
- 命令行执行:
php think clear:config(TP6.1+)或php think clear - 手动删掉
runtime/cache/目录下的所有文件 - 开发环境可临时设
APP_DEBUG = true并关掉配置缓存(但别在生产用)
最容易被忽略的是缓存没清——改了十遍 .env 都连不上库,大概率卡在这一步。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











