Hyperf中异步MySQL写入核心是协程化客户端:默认启用Swoole协程Hook的PDO驱动,通过go()启动协程执行DB::insert()或Eloquent操作,事务需在单协程内用DB::transaction()闭包完成,无需手动使用Swoole\Coroutine\MySQL。

Hyperf 中实现异步 MySQL 写入,核心是使用 协程 MySQL 客户端(Hyperf\Database\Connection 默认已协程化),配合 go 启动协程或直接在协程上下文中执行,而非用传统同步阻塞方式。
确保数据库配置启用协程驱动
Hyperf 默认使用 mysql 作为 PDO 驱动,但要真正异步,需改用 swoole_mysql 协程驱动(Hyperf 3.x 推荐)或确认 PDO 已被 Swoole 协程 Hook(Hyperf 2.x/3.x 默认开启)。检查 config/autoload/databases.php:
- 确认
'driver' => 'mysql'(Hyperf 会自动适配协程版 PDO) - 确保
'options' => [PDO::ATTR_CASE => PDO::CASE_NATURAL]等配置无冲突 - 不需要手动 new Swoole\Coroutine\MySQL —— Hyperf 封装已处理底层协程调度
在协程中直接调用 ORM 或 QueryBuilder
只要当前上下文是协程(如 HTTP 请求、定时任务、go() 启动的函数),所有 Eloquent 或 DB 操作默认就是异步非阻塞的:
- 使用
DB::insert()/DB::table()->insert() - 使用 Eloquent 模型:
User::create([...])或$user->save() - 批量插入推荐
DB::table()->insert([...]),性能更好
示例:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
$id = DB::table('users')->insertGetId([
'name' => 'hyperf',
'email' => 'h@h.com',
'created_at' => date('Y-m-d H:i:s')
]);
 >var_dump('插入成功,ID:', $id);
});
注意事务与协程生命周期绑定
Hyperf 的数据库事务是协程隔离的,即每个协程拥有独立的连接和事务状态:
- 不要跨协程复用
DB::transaction()回调 - 事务必须在同一个协程内开启、提交/回滚
- 避免在闭包外手动
DB::beginTransaction(),推荐用DB::transaction(fn() => {...})
正确写法:
DB::transaction(function () {User::create(['name' => 'A']);
Profile::create(['user_id' => 1, 'bio' => 'test']);
});
不建议手动管理连接或使用原生 Swoole MySQL
除非有特殊需求(如超大吞吐直连、自定义协议),否则不要绕过 Hyperf DB 层**直接使用 Swoole\Coroutine\MySQL**:
- 失去查询构建器、ORM、事件、日志、连接池等能力
- 需自行处理重连、超时、编码、预处理、协程上下文切换
- Hyperf 的
DB组件已针对协程优化,足够高效且安全

















