ThinkPHP多库配置必须在config/database.php的connections数组中定义,其他位置无效;connections是框架唯一读取的连接配置区,键名须小写+下划线,每个连接必须含type、hostname等完整参数,并通过env()读取.env敏感信息,修改后需执行php think clear:config清除缓存。

不能在“公共文件”里配多个数据库——ThinkPHP 的多库配置必须落在 config/database.php 的 connections 数组里,其他地方写都无效或不可靠。
为什么 config/database.php 是唯一合法位置
TP6+ 的数据库连接管理是启动时一次性加载的,框架只认 config/database.php 中 connections 下定义的命名连接。你把配置塞进 common.php、base.php 或任何“公共函数文件”,框架根本不会去读它;Db 类调用 Db::connect('xxx') 时,会直接查这个数组,找不到就抛 Connection not found: xxx。
-
connections必须是关联数组,键名小写+下划线(如log_db),不能含点、大写、数字开头 - 每个连接必须显式写出
type(mysql/pgsql/sqlsrv),漏掉会报Class 'PDO' not found - 所有参数(
hostname、database、username、password)一个都不能少,空字符串也要写清楚
想分离敏感信息?用 .env + env() 函数,别动公共文件
密码、host 这类值不该硬编码在 PHP 配置里。.env 是标准解法:在项目根目录放 .env,写 LOG_DB_HOST=192.168.1.100,然后在 config/database.php 里用 env('LOG_DB_HOST', '127.0.0.1') 读取。这样开发/测试/生产环境可共用一份 database.php,只换 .env 文件。
- 确保
.env是 UTF-8 无 BOM 格式,否则env()可能读成空 - 不要在
.env里写带编号的多库配置(如DATABASE2_HOST),TP 不识别这种写法 - 改完
.env后要执行php think clear:config,否则缓存不刷新
Db::connect() 调用前没清缓存,配了也白配
很多人改完 config/database.php 就直接跑代码,发现还是连不上新库——大概率是配置缓存没清。TP 默认会把配置编译进 runtime/cache/ 下的 PHP 文件,不手动清除,框架永远读旧配置。
立即学习“PHP免费学习笔记(深入)”;
- 每次修改
connections后,必须运行php think clear:config - 开发阶段可临时关掉配置缓存:在
app.php里设'config_cache' => false,但上线必须关掉 - 如果用了 Swoole 或 RoadRunner,还要重启服务进程,光清缓存不够
模型里用 $connection 指定连接,但别指望它自动识别表名
模型类写 protected $connection = 'log_db'; 是最常用绑定方式,但它只生效于该模型的主表操作。一旦你调 UserModel::with('profile')->select(),关联的 ProfileModel 如果没也写 $connection,就会静默切回 default 连接,导致跨库 JOIN 失败或查错库。
-
$connection值必须和connections数组里的键**完全一致**(大小写敏感),写成'LogDb'或'log-db'都会 fallback 到 default - 跨库关联没法自动路由,得拆成两次查询,或手写原生 SQL +
table('db_name.table') - 事务只支持单连接内,
Db::connect('a')->startTrans()和Db::connect('b')不能套一起用
真正容易被忽略的是:Db 是无状态门面,Db::connect('log_db') 返回的是全新 Query 实例,不链式调用或不赋值给变量,下一行就失效。写两行代码却连了两个库,是最常见的低级翻车点。



















