Hyperf默认通过Swoole协程MySQL客户端实现连接复用,无需独立连接池组件;关键配置在databases.php中设置pool.min_connections、max_connections、max_idle_time等参数,并确保MySQL服务端max_connections足够。

Hyperf 默认使用 Swoole 协程 MySQL 客户端(Swoole\Coroutine\MySQL),它本身不依赖传统意义上的“连接池”组件,而是通过协程调度 + 连接复用机制天然实现高并发下的连接高效利用。但很多人问的“配置 MySQL 协程连接池”,实际指的是:如何合理设置 Hyperf 的 mysql 组件参数,使其在协程环境下稳定、高性能地复用连接,并避免连接耗尽或超时问题。
以下是关键配置项和实用建议:
✅ 正确理解 Hyperf 的 MySQL 连接管理机制
- Hyperf 的
hyperf/database组件底层调用的是Swoole\Coroutine\MySQL,每个协程内会自动复用空闲连接(非每次 new 一个新连接)。 -
没有独立的“连接池对象”需要手动实例化或命名(区别于 Java 的 HikariCP 或 Python 的
mysql-connector-pythonpool)。 - 所谓“池”,是 Swoole 内部维护的连接缓存 + 连接生命周期管理,由
max_idle_time、timeout、pool配置共同影响。
✅ 核心配置位置与推荐参数(config/autoload/databases.php)
'mysql' => [
'driver' => env('DB_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' => env('DB_CHARSET', 'utf8mb4'),
'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
'prefix' => env('DB_PREFIX', ''),
'strict' => true,
'pool' => [
'min_connections' => 1, // 协程启动时预创建的最小连接数(可设为 0)
'max_connections' => 32, // 允许同时打开的最大连接数(重点!根据并发量调)
'connect_timeout' => 10.0, // 建连超时(秒)
'wait_timeout' => 3.0, // 从连接池获取连接的等待超时(秒)
'heartbeat' => -1, // 心跳检测间隔(秒),-1 表示禁用心跳(推荐)
'max_idle_time' => 60.0, // 连接最大空闲时间(秒),超时自动关闭
],
'options' => [
PDO::ATTR_CASE => PDO::CASE_NATURAL,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::MYSQL_ATTR_COMPRESS => false,
],
],
⚠️ 注意:
min_connections和max_connections是 Pool 组件控制的协程连接上限,不是 MySQL 服务端的max_connections。务必确保 MySQL 服务端max_connections≥ 应用所有 Worker 的max_connections总和(例如 4 个 Worker × 32 = 128,服务端至少设为 150+)。
MySQL8 CRM Schema Design Expert下载面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
✅ 生产环境必须检查的几件事
- 确保
swoole.enable_coroutine为true(Hyperf 默认开启) - 关闭
PDO::ATTR_EMULATE_PREPARES(已默认关),避免 prepare 失败或类型丢失 - 若使用读写分离,需额外配置
read/write数组,并注意各组pool.max_connections独立生效 - 长时间运行后偶发
SQLSTATE[HY000] [2013] Lost connection to MySQL server during query?大概率是max_idle_time小于 MySQL 的wait_timeout(默认 28800 秒),建议设为60~300,并让 MySQL 的wait_timeout≥ 应用侧max_idle_time
✅ 不要做的几件事
- 不要尝试在代码里手动
new Swoole\Coroutine\MySQL()并长期持有——破坏协程安全,且无法被 Pool 管理 - 不要给每个请求都
close()连接——Hyperf 自动归还;显式 close 可能导致后续协程拿到无效连接 - 不要盲目把
max_connections设到 100+——高连接数反而加剧 MySQL 线程竞争,应结合压测调整(通常 16–64 更稳)
不复杂但容易忽略。











