thinkphp多模块独立数据库需为每个模块在config/database.php中单独定义连接名(如admin_db、api_db),模型内通过$connection属性强制绑定,控制器用db::connect()指定连接,且各模块须独立runtime和config路径以防串库。

ThinkPHP 项目要做多模块独立数据库,关键不是“能不能分”,而是“怎么配才真正隔离”——每个模块必须用自己预定义的连接名,不能共用 default,也不能临时拼配置。
模块对应库需在 connections 中单独声明
比如你有 admin(后台)、api(接口)、portal(前台)三个模块,就要在 config/database.php 的 connections 数组里分别定义:
- 'admin_db':专供 admin 模块,指向管理后台专用库,含完整 type、hostname、database 等六项;
- 'api_db':专供 api 模块,可设为只读集群或高并发优化实例;
- 'portal_db':专供 portal 模块,可配缓存友好型参数如 'debug' => false。
连接名必须是合法 PHP 变量名(小写字母+下划线),不能含点号或大写;漏写 'type' => 'mysql' 会导致驱动误判,报 Class 'PDO' not found。
模块内强制绑定指定连接
不能依赖 default 或全局配置。要在每个模块的模型类中显式指定:
- 在 app/admin/model/User.php 中写:protected $connection = 'admin_db';
- 在 app/api/model/Order.php 中写:protected $connection = 'api_db';
- 控制器中执行原生查询时,用 Db::connect('portal_db')->table(...)->select()。
注意:模型的 $connection 只影响本模型主表操作;with 关联查询仍走关联模型自己的 connection,不会自动跨库 join —— MySQL 本身不支持,TP 也不会合并。
避免配置复用导致串库
常见翻车点是复制粘贴后只改了 database,忘了改 hostname 或 port。结果 admin_db 和 portal_db 实际连向同一台 MySQL 实例,等于白拆。
- 两个连接若都写 'hostname' => '127.0.0.1',即使 database 不同,也共享连接池和事务上下文;
- charset 必须统一(如全设为 'utf8mb4'),否则 emoji 字段写入从库会变问号;
- .env 文件无法定义 connections 结构,只能覆盖扁平变量(如 database.hostname),多库场景必须硬编码在 database.php 中。
多应用模式下不共用 runtime 和 config
若已启用多应用(如 app/admin/、app/api/),还需确保各模块配置真正独立:
- 每个子目录下要有自己的 config/database.php(可仅覆盖 connection 名,不重复写全部参数);
- 在 config/app.php 中设置 'runtime_path' => RUNTIME_PATH . 'admin/' 等差异化路径;
- 避免所有模块共用同一个 cache、log 目录,防止日志混写或缓存键冲突。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











