Hyperf读写分离核心是连接池分级+协程化客户端+SQL类型自动分发。需在databases.php配置read/write数组,启用Swoole\Runtime::enableCoroutine()并使用PDO/MySQLi,事务内所有操作强制走主库。

Hyperf 的读写分离协程配置,核心在于**连接池分级 + 协程化客户端 + 配置路由规则**,不是靠手动切换 PDO 实例,而是由框架自动根据 SQL 类型(`SELECT` / `INSERT/UPDATE/DELETE`)分发到对应连接池。 下面分三块说清楚怎么配、注意什么、常见踩坑点:
一、数据库配置启用读写分离
在 config/autoload/databases.php 中定义主从结构,关键字段是 'read' => [] 和 'write' => []:
- 主库(write)只配一个,用于写操作和事务
- 从库(read)可配多个,支持负载均衡(默认轮询)
- 所有库都必须开启协程化:通过
Swoole\Runtime::enableCoroutine()启用,且使用PDO或MySQLi(不再推荐旧版 Coroutine\MySQL)
示例片段:
'mysql' => [
'driver' => env('DB_DRIVER', 'mysql'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', 3306),
'database' => env('DB_DATABASE', 'test'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'charset' => env('DB_CHARSET', 'utf8mb4'),
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
'prefix' => env('DB_PREFIX', ''),
'strict' => true,
'read' => [
['host' => '192.168.1.10', 'port' => 3306],
['host' => '192.168.1.11', 'port' => 3306],
],
'write' => [
['host' => '192.168.1.5', 'port' => 3306],
],
'pool' => [
'min_connections' => 1,
'max_connections' => 20,
'connect_timeout' => 10.0,
'wait_timeout' => 3.0,
'max_idle_time' => 60,
],
],
二、确保运行时协程已启用
Hyperf 默认在 bin/hyperf.php 启动时调用 Swoole\Runtime::enableCoroutine(),但需确认两点:
- PHP 版本 ≥ 7.4,Swoole ≥ 4.8.0,且未禁用协程(如没设
hook_flags = SWOOLE_HOOK_ALL & ~SWOOLE_HOOK_STREAM) - 数据库驱动必须是
PDO或MySQLi,不能用废弃的Coroutine\MySQL - 若用 PDO,建议开启
PDO::ATTR_EMULATE_PREPARES => false,避免预处理语句退化为同步
三、读写分离行为控制与调试技巧
Hyperf 默认按 SQL 前缀判断读写,但你可以干预或验证:
- 强制走写库:
$this->db->useWritePdo()->select(...) - 强制走读库:
$this->db->useReadPdo()->select(...) - 查看当前协程使用的连接:
var_dump($this->db->getPdo());(注意它返回的是协程安全的封装实例) - 查日志确认分发逻辑:开启
db.query事件监听,或在config/autoload/logger.php中提高 database 日志等级
特别提醒:事务内所有查询(包括 SELECT)都会走主库,这是保证一致性必须的设计,无需也不应绕过。
不复杂但容易忽略。











