ThinkPHP 5.1 读写分离需配置 'deploy' => 1、'rw_separate' => true、hostname/password/username 为数组(首项主库,其余从库),事务、锁查询及写操作强制走主库,纯读方法如 select()/find() 自动走从库,无自动故障转移。

ThinkPHP 5.1 支持原生读写分离,但配置方式与 TP6 不同,需严格按框架识别的字段名和结构来写,否则不生效。
核心配置项必须正确设置
在 config/database.php 中,以下几项缺一不可:
- 'deploy' => 1:启用分布式部署(主从模式)的总开关,不设此项,后续所有读写分离配置都会被忽略
-
'rw_separate' => true:开启读写自动分离;设为 false 时需手动调用
->master()或->slave() -
'hostname' 必须是数组,例如
['192.168.1.102', '192.168.1.103']—— 第一个为默认主库,其余视为从库 -
'username' 和 'password' 也需对应为数组(即使相同也要写成
['root', 'root']),否则连接失败 - 所有节点的 database 名、表前缀、字符集必须一致,否则跨库查询或事务会出错
从库选择与故障处理
TP5.1 默认随机选取一个从库执行读操作,不支持自动故障转移:
- 若某个从库宕机,框架不会跳过它,而是直接报连接异常
- 如需容错,需手动捕获
PDOException,再降级走主库查询 - 可通过 'slave_no' => 0 强制指定使用第 0 个从库(索引从 0 开始),用于调试或固定路由场景
- 不建议设 'read_master' => true,它仅在从库全部失败时才读主库,且不适用于事务中
哪些操作走从库?哪些强制走主库?
TP5.1 按方法语义判断读写意图,不是所有 SELECT 都进从库:
- ✅ 自动走从库:
select()、find()、value()、column()、count()(纯读) - ❌ 强制走主库:
insert()、update()、delete()、save() - ⚠️ 特殊情况也走主库:事务中所有查询(
startTrans()后)、带锁查询(lock(true)或 SQL 含FOR UPDATE)、连贯操作含order()+limit()+count()组合时可能误判
验证是否生效
最直接的方式是开启数据库日志并观察 SQL 执行 IP:
- 在配置中打开
'debug' => true,然后用Db::getLastSql()查看生成的 SQL - 配合 MySQL 的
show processlist,分别在主库和从库上执行,观察连接来源 IP - 写操作(如
insert)应只出现在主库进程列表中,读操作(如select)应出现在从库进程列表中
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











