登录
首页 >  文章 >  php教程

PHP怎么进行数据库读写分离_PHP主从数据库配置思路【方法】

时间:2026-05-02 18:07:33 355浏览 收藏

小伙伴们有没有觉得学习文章很有意思?有意思就对了!今天就给大家带来《PHP怎么进行数据库读写分离_PHP主从数据库配置思路【方法】》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

PHP不支持自动读写分离,需代码层控制:写操作走主库,读操作默认走从库,强一致性场景强制走主库;用preg_match('/^\s*(SELECT|WITH|SHOW|EXPLAIN|DESCRIBE)/i', $sql)判断读操作,其余均为写操作;必须使用独立PDO实例连接主从库,事务内所有操作均须走主库。

PHP怎么进行数据库读写分离_PHP主从数据库配置思路【方法】

PHP 本身不支持自动读写分离,必须在代码层显式控制连接路由——写操作走主库,读操作默认走从库,但强一致性场景必须强制走主库。

怎么用正则判断 SQL 是读还是写

preg_match() 匹配语句开头是最轻量的判断方式,但要注意空格、注释和大小写。不能只匹配 SELECT,还得覆盖 WITH(CTE)、SHOW 等隐式读操作;写操作也不能漏掉 TRUNCATEDROPCREATE

  • 安全写法:preg_match('/^\s*(SELECT|WITH|SHOW|EXPLAIN|DESCRIBE)/i', $sql) 判定为读
  • 其余一律当写,包括 INSERTUPDATEDELETEREPLACEALTERTRUNCATEDROPCREATE
  • 别信 /*+ USE_SLAVE */ 这类注释——PDO/MySQLi 不解析它,ORM 可能直接过滤掉
  • 事务内所有语句都必须走主库,哪怕只有 SELECT,否则可能读不到刚写入的数据

为什么不能复用同一个 PDO 实例

主库和从库是两个独立 MySQL 实例,连接参数(host、port、read_only 状态)完全不同。复用一个 PDO 实例会导致:写操作发到从库报错 ERROR 1290 (HY000): The MySQL server is running with the --read-only option;或读操作连到主库,失去分流意义。

  • 必须准备至少两个连接:$pdo_master$pdo_slave,初始化时就分开建连
  • 连接字符串里不要混用 host,比如 "mysql:host=master;host=slave" 是无效的
  • 如果用了连接池或长连接,从库连接要显式加 'options' => [PDO::ATTR_PERSISTENT => true],否则每次查都新建 TCP 连接
  • ThinkPHP 6 要求 default 键存在且非空,slave 必须是数组,否则配置直接被忽略

哪些 SELECT 必须走主库

不是所有 SELECT 都能放心扔给从库。主从延迟几秒很常见,一旦“写完立刻读”,就会返回空或旧数据。

  • 刚执行过 INSERTUPDATE 的同一事务内后续 SELECT
  • 用户注册后跳转个人页,查刚插入的 user.id
  • 登录后立即查 user.permissionsmessage.unread_count
  • 支付成功后查 order.status WHERE id = ? —— 即使条件精确,也可能因延迟未同步
  • 任何带 FOR UPDATELOCK IN SHARE MODESELECT,从库不支持行锁

最易被忽略的一点:你以为只是简单查 ID,其实背后触发了关联子查询或视图展开,导致实际执行的是非确定性语句;而 MySQL ROW 格式 binlog 也无法保证这类语句在从库完全一致重放——这种场景下,宁可多走主库,也别赌同步延迟刚好为 0。

今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>