hyperf读写分离需手动配置主从连接池并显式路由:一、在databases.php中定义mysql_master和mysql_slave两个独立连接,各自完整配置参数及pool;二、运行时用db::connection()显式指定连接,写操作走主库、读操作走从库,事务仅限主库;三、cli命令如migrate需加--database参数;四、swow环境下须用嵌套pool格式并设check_interval≥3秒。

Hyperf 本身不内置主从复制逻辑,但可通过配置多个数据库连接 + 手动路由实现读写分离效果。关键不是“自动主从”,而是显式指定连接名,把写操作发给主库、读操作发给从库。
一、定义主库和从库连接
在 config/autoload/databases.php 的 connections 数组中,分别声明主库(mysql_master)和从库(mysql_slave),确保它们有明确语义名、独立连接参数和池配置:
- 主库连接需设
'read_only' => false(非必需但建议加注释),从库建议设'read_only' => true - 每个连接必须完整声明
driver、host、port、database、username、password -
pool子项不能省略,且min_connections/max_connections要按实例实际负载能力设置(例如从库读压力大,可适当调高max_connections) - 若主从版本不同(如主库 MySQL 8.0、从库 MySQL 5.7),必须分开配置,不可共用同一连接池
二、运行时手动控制读写流向
Hyperf 不会自动判断 SQL 类型并路由,所有读写都靠你代码里显式调用 connection():
- 写操作统一走主库:
Db::connection('mysql_master')->table('users')->insert([...]) - 读操作走从库:
Db::connection('mysql_slave')->table('users')->where('id', 1)->first() - Eloquent 模型也可绑定特定连接:在模型类中加
protected $connection = 'mysql_slave'; - 事务必须全部在主库执行:
Db::connection('mysql_master')->transaction(function () { ... }),跨连接事务不支持
三、迁移与命令行工具适配
执行迁移、生成表结构等 CLI 命令时,需通过 --database 显式指定目标连接:
- 对主库执行迁移:
php bin/hyperf.php migrate --database=mysql_master - 对从库执行只读检查(如验证表结构):
php bin/hyperf.php db:show --database=mysql_slave - 生成迁移文件本身不依赖数据库,但执行
migrate前务必确认对应连接的host、database等配置正确,否则报 PDO 连接失败
四、Swow 环境下特别注意连接池参数
若项目已启用 Swow 协程引擎(mode => SWOW_BASE),旧版 pool 配置会被忽略,必须重写为 Swow 兼容格式:
- 删除原
pool.min_connections等扁平写法,改用嵌套'pool' => [ ... ]结构 - 必须设置
'check_interval' => 3000(≥3 秒),否则心跳异常中断 - 建议主库连接池
max_connections设得稍保守(如 32),从库可设更高(如 64),匹配读多写少场景 - 修改后务必清理
runtime/container并重启服务,否则新配置不生效











