tp6读写分离必须开启'deploy'=>1,否则即使配置read/write也无效;default连接必须存在且为字符串;事务、强一致性读、带锁查询等场景需手动切库。

TP6 的读写分离不是加个 read 数组就能跑起来的,漏掉 deploy => 1 或把主库配成数组,整个配置就等于没写。
为什么 Db::table('user')->select() 还是走主库?
最常见原因是 deploy 没开——TP6 完全不识别 rw_separate,除非你先声明 'deploy' => 1。这个开关一关,哪怕 read 和 write 都填满了,所有查询仍默认走 default 连接。
-
default必须存在,且值为字符串(如'mysql'),不能是空数组或直接删掉 -
'mysql'这个连接配置里必须包含'deploy' => 1、'rw_separate' => true -
'read'是数组,支持单从库或多个从库;'write'只能是单个数组,写成数组会直接报错Invalid write database config - 事务中所有查询(包括
SELECT)强制走主库,和是否加锁无关
hostname 用逗号分隔 vs read/write 分开写,哪种对?
TP6 已废弃逗号分隔写法(如 'hostname' => '192.168.1.1,192.168.1.2'),那是 TP5 的老语法。现在必须显式拆成 read 和 write 两个键,每个都是完整连接配置。
- 旧写法在 TP6 下不会报错,但
read配置被忽略,只认第一个 IP 为主库 -
read支持数组套数组:['host' => '192.168.1.10'](单从库)或[ ['host' => '192.168.1.10'], ['host' => '192.168.1.11'] ](多从库,TP 随机选) - 从库配置里不要出现
deploy或rw_separate,TP6 会直接跳过该配置项 - 如果用了长连接,记得在每个从库配置里加
'params' => [PDO::ATTR_PERSISTENT => true],否则每次查都重建连接
什么时候必须手动切库?
自动分离只覆盖常规读写判断,三类场景它不管,得你自己干预:
- 强一致性读:刚写完马上要查最新结果,用
Db::name('user')->master(true)->find(1) - 带锁查询:
->lock(true)或原生 SQL 含FOR UPDATE/LOCK IN SHARE MODE,TP 自动切主,但如果你明确想走从库(比如做只读分析),就得Db::connect('mysql_slave')手动指定 - 跨库关联查询:比如
JOIN主库表 + 从库表,TP 不解析语义,一律按写操作路由到主库——这时只能拆成两次查询,或改用中间件(如 ProxySQL)
最容易被忽略的是 deploy => 1 这个总开关,它不在文档最前面,却卡死整个流程。另外,TP6 不再兼容 TP5 的逗号分隔式配置,升级时如果只改了数组结构但没补上 deploy,日志里连 warning 都不打,只会静默降级为单库模式。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











