php实现读写分离
读写分离简介
读写分离是一种数据库架构设计模式,将数据库操作分为读操作(SELECT)和写操作(INSERT/UPDATE/DELETE),分别分配给不同的数据库服务器。主库(Master)负责写操作,从库(Slave)负责读操作,从而提升系统性能和高可用性。
PHP实现读写分离的方法
使用PDO或MySQLi手动切换连接
通过代码逻辑判断SQL操作类型,动态选择主库或从库连接:

// 主库配置(写操作)
$master = new PDO('mysql:host=master_host;dbname=db', 'user', 'password');
// 从库配置(读操作)
$slave = new PDO('mysql:host=slave_host;dbname=db', 'user', 'password');
function getConnection($sql) {
$isRead = preg_match('/^SELECT/i', trim($sql));
return $isRead ? $GLOBALS['slave'] : $GLOBALS['master'];
}
// 示例使用
$sql = "SELECT * FROM users";
$conn = getConnection($sql);
$stmt = $conn->query($sql);
使用框架内置功能
主流PHP框架(如Laravel、ThinkPHP)支持读写分离配置:
Laravel示例(配置database.php):

'mysql' => [
'driver' => 'mysql',
'write' => [
'host' => 'master_host',
],
'read' => [
'host' => 'slave_host',
],
'sticky' => true, // 确保写操作后的读请求发送到主库
// 其他公共配置...
]
ThinkPHP示例:
return [
'type' => 'mysql',
'hostname' => 'master_host,slave_host', // 多个从库用逗号分隔
'rw_separate' => true, // 启用读写分离
];
使用中间件或代理
通过中间层(如MySQL Router、ProxySQL)自动路由请求:
- 部署ProxySQL作为数据库代理
- 配置规则将写请求转发到主库,读请求负载均衡到从库
- PHP应用只需连接ProxySQL地址
注意事项
- 数据一致性:主从同步存在延迟,对一致性要求高的场景需强制读主库
- 故障转移:需监控从库状态,异常时自动降级到主库
- 连接池管理:建议使用连接池避免频繁创建连接
性能优化建议
- 多从库配置时实现负载均衡
- 使用长连接减少连接开销
- 对时效性不高的数据启用缓存(如Redis)






