必须设置根目录config/app.php中'app_multi' => true,且各应用需独立配置app/{name}/config/database.php,db::getconfig()输出应因应用而异。

ThinkPHP6 多应用模式下,要让 admin、api、portal 等应用真正使用各自独立的数据库,关键不是“配对”,而是“物理隔离+显式绑定”。配置错一层,所有后续操作都白搭——比如没开 app_multi,或 database.php 放错位置,结果仍是所有模块共用一个库。
必须先打开多应用总开关
这个配置只在一处生效:项目根目录的 config/app.php,且必须是数组键 'app_multi' => true(注意不是 app_multi_module,也不是环境常量)。漏设、写错位置(比如写进 app/admin/config/app.php)、或被注释掉,框架就永远按单应用流程跑,后面所有「每个应用配自己 database.php」的尝试都会静默失效。
- 确认
config/app.php中有这一行:'app_multi' => true, - 删掉任何形如
'app_multi_module' => false的干扰项 - 不要依赖
.env或入口文件定义 APP_MULTI_MODULE —— 它控制的是模块路由解析,和数据库隔离无关
每个应用必须有自己真实的 database.php 文件
ThinkPHP6 不继承、不合并、不查找上级配置。app/admin/config/database.php 和 app/api/config/database.php 是两个完全独立的文件,哪怕内容一模一样,也必须各自存在。缺一个,对应应用启动时直接报错:No database configuration found。
- 路径必须严格为:
app/{应用名}/config/database.php(例如app/admin/config/database.php) - 文件里至少定义
'connections' => ['mysql' => [...]],且每个连接数组中必须含'type'字段(如'type' => 'mysql'),否则会提示Class 'PDO' not found - 连接名(如
'log_db')可重名,但仅在本应用内有效;不能含点号(db.log)或大写字母(LogDB),否则调用时报Connection not found: xxx
Db::connect() 和模型 $connection 都只作用于当前应用
你在 app/admin/controller/User.php 里写 Db::connect('mysql_read'),框架只去 app/admin/config/database.php 的 connections 里找 mysql_read;同理,app/api/model/Order.php 设了 protected $connection = 'pgsql',它只影响 api 应用下的 Order 模型,跟 admin 里的同名模型毫无关系。
- 关联查询(
with())不会跨应用自动切换连接——User 模型连 mysql,其关联的 Profile 模型若在另一个应用,仍走自身应用的$connection,无法自动 join - 跨库数据同步只能手动查两次再 PHP 合并,框架不提供跨应用事务或联合查询能力
- 避免在控制器里反复调用
Db::connect(['hostname' => ...])这类临时数组方式,它绕过连接池,高并发下易触发Too many connections
验证是否真正隔离的两个快速方法
不用跑完整业务,两步就能确认数据库是否已按应用切开:
- 在
app/admin/controller/Test.php中执行:dump(\think\facade\Db::getConfig());—— 输出应只含app/admin/config/database.php里的配置 - 在
app/api/controller/Test.php中执行同样代码 —— 输出应是另一套配置,且与 admin 的完全不同(比如 host、database 名不一致) - 如果两次 dump 结果一样,说明不是配置没生效,就是文件放错了位置
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











