thinkphp读写分离需启用'deploy'=>1和'rw_separate'=>true开关,tp6须用'slave'数组配置从库且禁用旧键,tp5支持逗号分隔地址;查询强制路由用->master(true),事务内自动走主库。

如果您在ThinkPHP项目中需要实现数据库读写分离,但配置后查询仍全部走主库或从库未生效,则可能是由于关键开关未启用或配置结构不符合框架要求。以下是解决此问题的步骤:
一、启用分布式部署与读写分离开关
ThinkPHP 5/6 版本均需显式开启分布式部署总开关和读写分离逻辑,否则即使填写了多台服务器地址,框架仍默认使用单库连接。该配置是主从生效的前提条件。
1、打开 config/database.php 文件(ThinkPHP 6)或 config.php(ThinkPHP 5)。
2、确保全局配置中包含以下两项且值为指定布尔量:
3、'deploy' => 1 —— 启用多服务器部署模式,缺省时整个读写分离机制不触发。
4、'rw_separate' => true —— 启用自动读写分离策略,设为 false 将禁用自动路由,必须手动调用 ->master() 或 ->slave()。
二、主从服务器地址配置方式(TP5 兼容方案)
ThinkPHP 5 支持通过字符串逗号分隔方式定义主从地址,框架按顺序将第一个视为写库(master),后续地址作为读库(slave)轮询使用。该方式简洁,但要求各库连接参数高度一致。
1、在配置文件中设置 'DB_HOST' => '192.168.1.10,192.168.1.11,192.168.1.12'。
2、对应设置 'DB_NAME' => 'myapp,myapp,myapp',若所有库名相同可仅写一个值。
3、用户名与密码同理:若一致则 'DB_USER' => 'root' 单值即可;若不同,须以逗号分隔并严格对齐顺序,如 'DB_USER' => 'master_user,slave1_user,slave2_user'。
4、确认已启用 'DB_DEPLOY_TYPE' => 1 和 'DB_RW_SEPARATE' => true。
三、主从配置数组化结构(TP6 推荐方案)
ThinkPHP 6 废弃了旧版 deploy/rw_separate 字符串解析逻辑,转而要求使用结构化数组配置。主库必须命名为 'default',从库必须置于 'slave' 键下的完整配置数组中,且每个从库元素需包含全部连接参数。
1、在 database.php 的 connections 配置中,定义 'default' 为主库,type 必须为 'mysql'。
2、添加 'slave' 键,其值为含至少一个元素的数组,每个元素是一个独立的 MySQL 连接配置,包含 hostname、database、username、password 等字段。
3、删除旧键 'deploy'、'rw_separate'、'read'、'write' —— TP6 已废弃这些配置项,保留将导致降级为单库连接。
4、确保 'default' 不为空数组,且 'slave' 中无缺失必填字段(如 hostname 或 database)。
四、强制读写路由控制(运行时干预)
当业务存在强一致性需求(如刚写入立即读取),或需绕过默认轮询策略时,可通过链式方法显式指定执行节点。该操作优先级高于配置层自动路由,适用于临时性、确定性场景。
1、强制 SELECT 查询走主库:在查询构造器末尾添加 ->master(true),例如 Db::name('user')->where('id', 1)->master(true)->find()。
2、强制使用某特定从库:调用 Db::connect(['hostname' => '192.168.1.11', 'database' => 'myapp', ...]) 并在其后执行查询,但不推荐长期使用,因会跳过负载均衡。
3、事务内所有查询(包括纯 SELECT)自动走主库,无需额外标记;但若在事务中混用 Db::connect('slave'),将破坏一致性,应避免。
4、原生 SQL 查询中,Db::query() 默认走从库,Db::execute() 默认走主库,无论语句内容如何 —— 此为框架硬性规则。
五、MySQL 主从服务端基础配置验证
应用层配置正确仅是前提,底层 MySQL 主从复制通道必须稳定运行。若从库数据延迟或同步中断,即使 ThinkPHP 路由到从库,返回结果也可能陈旧或报错。
1、主库 my.cnf 中确认已启用 log-bin=mysql-bin 与唯一 server-id=1。
2、从库 my.cnf 中确认 server-id 值与主库不同(如 server-id=2),且已配置 relay-log 相关参数。
3、登录从库执行 SHOW SLAVE STATUS \G;,检查 Slave_IO_Running 与 Slave_SQL_Running 是否均为 Yes。
4、检查 Seconds_Behind_Master 值是否持续为 0 或极小(
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











