php实现读写分离
PHP 实现数据库读写分离
读写分离是一种常见的数据库优化策略,通过将读操作和写操作分配到不同的数据库服务器上,减轻主数据库的负载,提高系统性能。以下是实现 PHP 读写分离的几种方法:
使用 MySQL 主从复制 + PHP 配置
MySQL 主从复制是实现读写分离的基础,主库负责写操作,从库负责读操作。
-
配置 MySQL 主从复制
- 在主库启用二进制日志(
log-bin)。 - 配置从库连接到主库并同步数据。
- 确保主从同步正常运行。
- 在主库启用二进制日志(
-
PHP 代码中手动分离读写
- 在 PHP 中创建两个数据库连接,一个指向主库(写),一个指向从库(读)。
- 根据操作类型选择连接。
$writeDb = new PDO('mysql:host=master_host;dbname=dbname', 'user', 'password');
$readDb = new PDO('mysql:host=slave_host;dbname=dbname', 'user', 'password');
// 写操作
$writeDb->query("INSERT INTO table VALUES (...)");
// 读操作
$readDb->query("SELECT * FROM table");
使用框架内置的读写分离功能
许多 PHP 框架(如 Laravel、ThinkPHP)内置了读写分离支持。
- Laravel 读写分离配置
- 在
config/database.php中配置主从数据库连接。
- 在
'mysql' => [
'driver' => 'mysql',
'write' => [
'host' => 'master_host',
],
'read' => [
'host' => ['slave1_host', 'slave2_host'],
],
'database' => 'dbname',
'username' => 'user',
'password' => 'password',
],
- ThinkPHP 读写分离配置
- 在数据库配置中指定主库和从库。
'db_config' => [
'type' => 'mysql',
'master' => [
'host' => 'master_host',
],
'slave' => [
['host' => 'slave1_host'],
['host' => 'slave2_host'],
],
];
使用中间件或代理
通过中间件(如 MySQL Router、ProxySQL)自动路由读写请求。
- ProxySQL 配置
- 安装并配置 ProxySQL,设置主库和从库。
- 修改 PHP 连接字符串指向 ProxySQL 地址。
$db = new PDO('mysql:host=proxysql_host;dbname=dbname', 'user', 'password');
- MySQL Router
- 配置 MySQL Router 实现读写分离。
- PHP 直接连接 MySQL Router,无需修改代码。
使用 ORM 或数据库抽象层
一些 ORM(如 Doctrine)支持读写分离配置。

- Doctrine 读写分离配置
- 在配置文件中指定主从连接。
$conn = [
'driver' => 'pdo_mysql',
'master' => [
'host' => 'master_host',
],
'slaves' => [
['host' => 'slave1_host'],
],
];
注意事项
- 主从延迟:从库可能存在延迟,需要业务容忍或强制读主库。
- 故障转移:主库故障时需手动或自动切换。
- 负载均衡:多个从库时可通过轮询或权重分配读请求。






