Hyperf 3.2 的 Model 天然支持协程 MySQL,前提是正确配置连接池、启用 Swoole 协程运行时(enable_coroutine=true),并使用 hyperf/database 组件;Model 写法与 Laravel 一致,底层自动从协程连接池获取 PDO 连接,无需手动干预协程调度。

Hyperf 3.2 的 Model 默认不直接使用协程 MySQL 连接,它底层依赖的是 hyperf/database 组件,而该组件在 v3.2 中默认基于 Swoole 协程 MySQL 客户端(即 Swoole\Coroutine\MySQL)封装的连接池,但前提是你的配置和运行环境正确启用协程化。
关键点不是“Model 怎么用协程连接”,而是:Model 会自动从连接池取一个协程化的 PDO 或原生 Swoole MySQL 连接(取决于配置)——你只需确保连接池本身是协程安全的,并正确配置。
下面分三块说清楚:
✅ 正确启用协程 MySQL 连接池(前提)
Hyperf 3.2 不再推荐使用已废弃的 Coroutine\MySQL 客户端(如旧版 hyperf/db 中的 Coroutine\MySQL),而是统一走:
-
Swoole\Runtime::enableCoroutine()+ 原生PDO(推荐)
或 Swoole\Coroutine\MySQL(需显式启用且注意兼容性)
⚠️ 注意:官方文档和社区实践已明确建议优先使用
PDO + enableCoroutine方式,更稳定、兼容性更好、调试更直观。
配置示例(config/autoload/db.php):
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
return [
'default' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => (int) env('DB_PORT', 3306),
'database' => env('DB_DATABASE', 'hyperf'),
'username' => env('DB_USERNAME', 'root'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'fetch_mode' => PDO::FETCH_ASSOC,
'pool' => [
'min_connections' => 1,
'max_connections' => 20,
'connect_timeout' => 5.0,
'wait_timeout' => 3.0,
'heartbeat' => 30, // 每30秒探测空闲连接
'max_idle_time' => 60.0,
],
'options' => [
PDO::ATTR_TIMEOUT => 3, // 执行超时3秒
],
],
];同时确保已在 bin/hyperf.php 或 config/autoload/server.php 中启用协程(Hyperf 3.2 默认已开启):
// config/autoload/server.php
'swoole' => [
'enable_coroutine' => true, // 必须为 true
// ...
],✅ Model 写法照常,协程由连接池自动提供
你写的 Model 和普通 Laravel 风格完全一致,无需手动切协程、无需 new PDO、也不用调 go():
<?php
namespace App\Model;
use Hyperf\DbConnection\Model\Model;
class User extends Model
{
protected $table = 'users';
}在 Controller 或 Service 中直接使用:
<?php
namespace App\Controller;
use App\Model\User;
use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\GetMapping;
#[Controller]
class UserController
{
#[GetMapping("/user/{id}")]
public function get(int $id)
{
// ✅ 这行会自动从协程连接池取连接,执行非阻塞查询
return User::find($id);
// 或链式查询(同样协程安全)
// return User::where('status', 1)->limit(10)->get();
}
}底层原理:hyperf/database 在执行 SQL 前,会通过 DbConnectionFactory 从配置好的连接池中 get() 一个协程化连接(PDO 实例),所有操作都在当前协程上下文中完成,无阻塞。
✅ 避坑要点(高频问题)
-
不要在协程外初始化 Model 查询:比如在
__construct()、静态属性初始化、或onWorkerStart回调里执行User::first()—— 此时可能无协程上下文,连接池无法正常工作。 -
避免混用非协程 DB 工具:如自己
new mysqli()或mysql_connect(),会破坏协程调度,导致阻塞。 -
事务需在同协程内完成:跨协程的
beginTransaction+commit会失败,必须包在同一个go()或请求生命周期内。 -
连接泄漏常见原因:未正确关闭长连接、
max_idle_time设得过大、heartbeat未开启导致僵尸连接堆积 → 表现为2006 MySQL server has gone away。
用一句话总结:
Hyperf 3.2 的 Model 天然支持协程 MySQL,只要你配对了连接池参数、启用了协程运行时,写法和 Laravel 几乎一样,框架自动帮你完成协程连接复用与生命周期管理。

















