主从复制未就绪,php读写分离即失效:必须验证主库binlog开启且有file/position、从库io/sql线程为yes且延迟低、网络互通、参数一致;laravel仅对模型和db::table()->get()等调用生效,原生sql需手动指定连接;正则判断sql类型易漏replace、ddl及加锁select,应改用白名单或多条件判定。

主从复制没跑通,PHP 读写分离就是空中楼阁
PHP 层面配得再漂亮,read/write 配置写满屏幕,只要 MySQL 主从同步没真正就绪,所有读操作都会返回过期、空或错乱数据。这不是 PHP 的 bug,是架构前提没满足。
必须逐项验证:
- 主库
SHOW MASTER STATUS能查到非空的File和Position,且log_bin为ON - 从库
SHOW SLAVE STATUS\G中Slave_IO_Running和Slave_SQL_Running都是Yes,且Seconds_Behind_Master稳定在0或个位数(不能只看Yes,要盯Master_Host是否真实、Relay_Log_File是否在滚动) - 主库防火墙放开
3306(或自定义端口),从库能telnet通,且时间同步(ntpdate或chronyd) -
max_allowed_packet在主从两端一致,否则大事务会卡在 relay log 解析阶段
Laravel 的 read/write 配置只对特定调用生效
很多人改完 config/database.php 里的 'read' 和 'write' 数组,就以为万事大吉——结果 DB::select('SELECT ...') 还是从主库走,或者事务里 SELECT 死活不进从库。这是因为 Laravel 的路由逻辑有明确边界:
- 仅对
Eloquent模型查询(如User::all())和DB::table()->get()等门面调用生效 -
DB::select()、DB::statement()、DB::raw()等原生方法绕过路由,直连默认连接 -
DB::transaction()内所有语句强制走write连接,不管 SQL 类型 - 显式指定连接名(如
DB::connection('mysql'))也会跳过read/write分离逻辑
如果要用原生 SQL 实现读写分流,得自己封装 DB::connection('slave') 或改用 DB::connection('mysql_read') 显式调用。
SQL 类型判断不能只靠正则匹配开头
手动写 preg_match('/^(INSERT|UPDATE|DELETE)/i', $sql) 来区分读写,上线后大概率翻车。MySQL 里大量合法写操作根本不会被这个正则捕获:
-
REPLACE INTO—— 是写,但不以INSERT开头 -
INSERT ... ON DUPLICATE KEY UPDATE—— 写操作,正则只匹配到INSERT就停了 -
TRUNCATE TABLE、DROP TABLE、ALTER TABLE—— DDL 全是写,但完全不在正则范围内 -
SELECT ... FOR UPDATE、SELECT ... LOCK IN SHARE MODE—— 表面是 SELECT,实际加锁,应走主库
更稳妥的做法是:把已知的写操作关键词建白名单数组,用 stripos() 多次扫描;或直接将所有非纯 SELECT(不含 FOR UPDATE / LOCK IN SHARE MODE)默认归为写操作。
从库连接池和 sticky 设置直接影响一致性体验
高并发下,如果所有读请求都打到同一个从库连接,而该连接又没做连接池管理,很容易触发 max_connections 拒绝或 wait_timeout 断连。更隐蔽的问题是主从延迟:
- 用户刚提交订单(写主库),立刻刷新页面查列表(读从库),结果查不到——这是典型延迟问题
-
'sticky' => true可缓解:一次 HTTP 请求内,只要发生过写操作,后续读也强制走主库,直到请求结束 - 多个从库时,别只写死一个地址;要在配置里定义数组,配合简单轮询或健康检查(比如
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION捕获连接失败后自动切下一个) - 从库地址千万别用
127.0.0.1测试——本地回环掩盖网络延迟和 DNS 解析问题,上线后才发现超时频发
真正难的不是写几行路由代码,而是让每个读请求都知道“此刻该信谁”。主从延迟不是理论值,是每毫秒都在变化的现实;而用户感知到的“数据没更新”,往往就差那 200ms 的 Seconds_Behind_Master。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











