php实现读写分离
读写分离简介
读写分离是一种数据库架构设计模式,将数据库操作分为读操作和写操作,分别指向不同的数据库服务器。写操作通常集中在主库(Master),读操作分散到从库(Slave),从而提升系统整体性能。
实现方案
配置主从数据库
确保MySQL主从复制已配置完成。主库负责写入数据,从库通过二进制日志同步主库数据。

使用PDO或MySQLi扩展
在PHP中,可以通过PDO或MySQLi手动实现读写分离逻辑。创建两个连接对象,分别指向主库和从库。
// 主库连接(写操作)
$master = new PDO(
'mysql:host=master_host;dbname=db',
'username',
'password'
);
// 从库连接(读操作)
$slave = new PDO(
'mysql:host=slave_host;dbname=db',
'username',
'password'
);
抽象数据库操作类
封装一个数据库操作类,根据SQL类型自动选择连接:

class DB {
private $master;
private $slave;
public function __construct() {
$this->master = new PDO('mysql:host=master_host;dbname=db', 'user', 'pass');
$this->slave = new PDO('mysql:host=slave_host;dbname=db', 'user', 'pass');
}
public function query($sql) {
$isWrite = preg_match('/^\s*(INSERT|UPDATE|DELETE|REPLACE)/i', $sql);
$conn = $isWrite ? $this->master : $this->slave;
return $conn->query($sql);
}
}
使用中间件
更成熟的方案是采用数据库中间件,如MySQL Router、ProxySQL等。这些工具能自动路由读写请求,无需修改应用代码。
框架集成
许多PHP框架内置读写分离支持:
- Laravel:在
database.php配置中定义读写连接 - ThinkPHP:通过配置
deploy模式启用读写分离
// Laravel配置示例
'connections' => [
'mysql' => [
'read' => [
'host' => ['slave1', 'slave2'],
],
'write' => [
'host' => 'master',
],
],
]
注意事项
- 主从同步延迟可能导致读取到旧数据,对一致性要求高的场景需强制读主库
- 事务中的所有操作应路由到主库
- 从库需要负载均衡策略,如轮询或随机选择
- 监控主从同步状态,避免数据不一致






