当前位置:首页 > PHP

php实现主从分离

2026-02-15 22:26:10PHP

实现 MySQL 主从分离的 PHP 方案

主从分离(读写分离)是数据库优化的常见手段,通过将读操作分发到从库,写操作定向到主库,减轻主库压力。以下是 PHP 实现主从分离的几种方法:

使用 PDO 或 MySQLi 手动分离

创建两个数据库连接对象,分别指向主库和从库,在代码中根据操作类型选择连接:

// 主库连接(写操作)
$master = new PDO('mysql:host=master_host;dbname=db', 'user', 'password');

// 从库连接(读操作)
$slave = new PDO('mysql:host=slave_host;dbname=db', 'user', 'password');

// 写操作示例
$master->query("INSERT INTO users (name) VALUES ('John')");

// 读操作示例
$result = $slave->query("SELECT * FROM users");

使用中间件代理

通过中间件(如 ProxySQL、MySQL Router)自动路由读写请求,PHP 只需连接代理地址:

// 统一连接代理地址
$db = new PDO('mysql:host=proxy_host;dbname=db', 'user', 'password');

// 代理自动路由读写
$db->query("INSERT INTO logs (message) VALUES ('test')"); // 写操作到主库
$db->query("SELECT * FROM logs"); // 读操作到从库

框架内置支持

部分 PHP 框架(如 Laravel、ThinkPHP)内置读写分离配置。以 Laravel 为例:

php实现主从分离

// config/database.php 配置
'mysql' => [
    'write' => [
        'host' => 'master_host',
    ],
    'read' => [
        'host' => 'slave_host',
    ],
    'sticky' => true, // 同一请求内读写保持一致性
];

// 代码中无需显式区分
DB::table('users')->insert(['name' => 'Jane']); // 自动写主库
DB::table('users')->get(); // 自动读从库

注意事项

  • 主从延迟:从库同步可能存在延迟,对实时性要求高的查询可强制读主库。
  • 连接池管理:高并发场景建议使用连接池(如 Swoole 的数据库连接池)。
  • 故障转移:需监控从库状态,异常时自动降级到主库。

性能优化建议

  1. 使用预处理语句减少 SQL 解析开销
  2. 对从库配置多个读副本实现负载均衡
  3. 对高频查询考虑引入缓存层(如 Redis)

标签: 主从php
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (int…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php购物车实现

php购物车实现

PHP购物车实现方法 使用PHP实现购物车功能可以通过多种方式完成,以下是几种常见的实现方法: Session存储购物车数据 利用PHP的$_SESSION超全局变量存储购物车数据是最简单的方法。用…

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Sessi…

php实现推送

php实现推送

PHP 实现推送功能的方法 PHP 实现推送功能可以通过多种方式完成,包括 WebSocket、Server-Sent Events (SSE)、长轮询或第三方推送服务。以下是几种常见的方法: 使用…

php 实现单链表

php 实现单链表

单链表的基本概念 单链表是一种线性数据结构,由节点组成,每个节点包含数据域和指向下一个节点的指针域。链表的头节点是访问整个链表的入口。 单链表的节点类实现 在PHP中,可以通过类来定义链表节点。每个…