ThinkPHP数据库环境分离关键在于database.php必须用env()显式读取.env变量并设默认值,.env需放根目录、全大写下划线命名、等号无空格、特殊字符加单引号,修改后须执行php think clear:config清缓存。
ThinkPHP 数据库配置要真正实现环境分离,关键不是“把参数挪到 .env”,而是让 database.php 主动、正确地读取它——否则改了 .env 也完全不生效。
所有可能随环境变化的字段,都得包裹 env() 并提供默认值。不能写死,也不能只靠框架自动映射。
'hostname' => env('DB_HOST', '127.0.0.1')
'database' => env('DB_NAME', 'tp_dev')
'username' => env('DB_USER', 'root')、'password' => env('DB_PASSWORD', '')
'hostport' => (int) env('DB_PORT', 3306)
default 和 connections 是顶层键,不用 env;但它们内部每个连接的字段都要单独处理位置和格式错一点,整个机制就断掉。
app/、config/、public/ 同级),不是 config/ 下,也不是 public/ 里DB_HOST ✅,db_host 或 DB-Host ❌DB_PASSWORD=abc123 ✅,DB_PASSWORD = abc123 ❌@、!)必须加单引号:DB_PASSWORD='pass@123!'
DB_PREFIX='',不能只写 DB_PREFIX=
ThinkPHP 会缓存配置,改了 .env 不执行清理命令,系统仍用旧值。
立即学习“PHP免费学习笔记(深入)”;
php think clear:config
php think env,看输出是否包含你刚写的 DB_* 变量php think migrate)连不上,大概率是缓存没清,或 env() 没写对位置需要区分主从、开发/生产库、或多个业务库时,.env 和 database.php 要配合扩展。
DB_MASTER_HOST=192.168.1.10 和 DB_SLAVE_HOST=192.168.1.11,database.php 中分别调用 env('DB_MASTER_HOST') 和 env('DB_SLAVE_HOST')
connections 数组里定义 'log_db'、'report_db' 等键,每个键内部字段都走 env()
APP_ENV=prod 控制行为分支,比如日志级别、调试开关,但数据库连接本身仍由 env() 驱动,不依赖 APP_ENV 值做 if 判断