thinkphp支持多数据库连接与第三方类库集成,需在config/database.php预定义connections、封装服务类解耦、用.env分离环境变量、模型绑定连接且服务调用显式指定db::connect。

一、多数据库连接必须预定义在 config/database.php 的 connections 中
所有要连的数据库(无论是否跨服务器),都必须作为命名连接写进 connections 数组,例如:
- mysql_master → 指向主库服务器(192.168.1.10)
- mysql_slave → 指向从库服务器(192.168.1.11)
- log_pg → 指向 PostgreSQL 日志服务器(192.168.1.12)
每个连接块必须显式声明 type(如 mysql 或 pgsql),且完整填写 hostname、database、username、password、hostport 等参数。漏掉任何一项,运行时会报错,比如 Class 'PDO' not found 或 Connection refused。
二、第三方类库统一封装为服务类,与数据库连接解耦
不要在控制器里直接 new 第三方 SDK,也不要把数据库连接混进服务类构造函数。正确做法是:
- 新建 app/service/PayService.php、app/service/SmsService.php 等,只专注业务逻辑
- 通过 config('services.alipay') 或 env('ALIPAY_APP_ID') 读取认证参数,不硬编码
- 服务类内部使用 GuzzleHttp\Client 发起 HTTP 请求,不依赖 Db 或模型
- 若需记录操作日志到指定数据库(比如把支付回调存到 log_pg),用 Db::connect('log_pg')->table(...)->insert() 显式调用,而非默认连接
三、环境配置用 .env 分离,但多库结构仍需写死在 database.php
.env 文件只能覆盖扁平变量(如 DB_HOST、DATABASE2_HOSTNAME),不能定义嵌套的 connections 结构。所以:
- 在 .env 中写:
DATABASE_HOST=192.168.1.10
DATABASE2_HOSTNAME=192.168.1.11
LOG_PG_HOST=192.168.1.12 - 在 config/database.php 的 connections 里,用 env('DATABASE2_HOSTNAME', '127.0.0.1') 动态注入——这样既安全又可移植
- 切记:不要尝试用 .env 直接写 connections 数组,框架不识别
四、模型与连接绑定、服务与数据库协作要明确边界
数据库连接和服务类是两类资源,协作时需划清职责:
- 模型类(如 app/model/Order.php)通过 protected $connection = 'mysql_master' 固定绑定某库,不随请求变化
- 支付回调控制器中,先用 PayService::handleNotify() 解析微信/支付宝通知,验证签名
- 验证成功后,再用 Db::connect('mysql_master')->name('order')->where(...)->update() 更新订单状态
- 同时用 Db::connect('log_pg')->table('pay_log')->insert([...]) 记录审计日志——两个连接完全独立,事务不共享
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











