ThinkPHP主从读写分离配置仅在database.php中生效,框架自动路由SELECT至从库、DML至主库;需正确设置default/read标识、type为mysql、多从库用数组,避免手动切库或错误类型导致失效。
主从配置写在 database.
php
里,不是靠中间件或命令行
ThinkPHP 的主从读写分离是框架层做的路由决策,不是数据库自身同步——同步得靠 MySQL 的 binlog + relay log 实现,TP 只负责把
发给从库、
发给主库。所以配置入口只有
,其他地方改了没用。
常见错误是试图在控制器里手动切库,或者以为加个
就算主从——这只能临时指定连接,不改变读写自动分发逻辑。
必须保持,不能写成
,否则从库配置会被忽略
主库必须定义为
,从库用
标识,框架才识别
从库可以配多个,用数组形式:
如果从库连不上,TP 默认会静默降级到主库查(取决于
配置),但不会报错提醒你从库挂了
readwrite 分离失效的三个典型原因
写了主从配置却还是全走主库?大概率卡在这几个点上:
模型用了
方法,强制走主库,连带后续所有查询都绑定主连接(包括关联查询)
事务中执行了
,TP 认为“可能要写”,一律路由到主库——哪怕你只是
开启了
(分布式部署模式),但没配
等必要项,导致读写策略未激活
验证是否生效:开调试模式,在日志里搜
,看 host 是不是从库地址;或者在从库
观察是否有连接进来。
立即学习
“
PHP免费学习笔记(深入)
”;
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
从库延迟导致数据不一致,TP 不管,得你自己兜底
MySQL 主从延迟是常态,TP 的读写分离机制完全不感知延迟。比如刚插入一条记录,紧接着查列表,很可能查不到——这不是 TP 的 bug,是架构必然代价。
强一致性场景(如支付结果页),必须显式调用
避免用
后立刻查同条记录,ID 能拿到,但数据可能还没同步到从库
不要依赖从库做唯一性校验(如注册时查用户名是否存在),否则可能重复插入
监控建议:在从库执行
,重点关注
,超过 5 秒就得告警
连接池和超时参数不配好,从库反而拖慢整体响应
从库通常比主库硬件弱,如果连接参数沿用主库默认值,容易雪崩:
对从库太激进,网络抖动时直接卡住整个请求;建议设为
或
没设
,某个从库宕机后,TP 会逐个重试所有从库,耗尽超时时间
在 FPM 下慎用,持久连接容易复用到已断开的从库连接
从库连接数上限(
)要单独调高,否则并发稍大就
真实线上环境里,主从配置最麻烦的从来不是怎么写,而是怎么让从库「稳得住、退得快、不扯后腿」——这些细节不压测根本暴露不出来。
SELECTINSERT/UPDATE/DELETEconfig/database.phpDb::connect('slave')'type' => 'mysql''type' => 'pdo''default' => true'read' => true'slave' => [['hostname' => '192.168.1.10', ...], ['hostname' => '192.168.1.11', ...]]'break_reconnection'->master()SELECTSELECT COUNT(*)'deploy' => 1'prefix' => 'think_'[ SQL ] SELECTSHOW PROCESSLISTDb::master()->table(...)->select()lastInsertId()SHOW SLAVE STATUS\GSeconds_Behind_Master'time_out' => 30510'break_reconnection' => true'params' => [\PDO::ATTR_PERSISTENT => true]max_connectionsToo many connections