Hyperf 不提供原生 MySQL 连接事件,但可通过监听 StatementExecuted 事件捕获连接就绪、利用 heartbeat 和异常反推连接失效、扩展连接类注入钩子三种方式精准掌握连接状态。

Hyperf 本身不提供 MySQL 连接建立/断开的原生事件(如 ConnectionOpened 或 ConnectionClosed),它没有像 Laravel 那样封装连接生命周期钩子。但你可以通过三种实际可行、生产环境验证过的方式,间接捕获连接行为——关键不是监听“连接动作”,而是监听连接被使用或失效时的可观测信号。
监听 StatementExecuted 捕获首次连接使用
当一个协程首次从连接池获取连接并执行 SQL 时,StatementExecuted 事件必然触发。此时连接已建立并完成握手,可视为“连接就绪”的可靠标志:
- 监听
Hyperf\Database\Events\StatementExecuted事件 - 在
process()中检查$event->connection实例是否为新创建(可通过spl_object_id()缓存做轻量判重) - 结合日志或指标记录连接初始化时间、来源协程 ID,用于连接池健康分析
利用 heartbeat 机制感知连接存活状态
Hyperf 的连接池启用心跳(pool.heartbeat > 0)后,会定期向 MySQL 发送 PING 包。虽然不直接暴露“连接检测成功/失败”事件,但可通过日志和异常反推:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 开启
pool.heartbeat: 30并设置max_idle_time: 60,确保检测窗口合理 - 监听
Hyperf\Exception\Handler\ExceptionHandler或捕获PDOException,当出现2006 MySQL server has gone away时,说明该连接已被 MySQL 主动关闭,即“连接失效”发生 - 配合
Hyperf\Logger\LoggerFactory记录带连接 ID 的错误上下文,实现连接异常归因
在连接池回调中注入自定义逻辑(需扩展)
Hyperf 允许通过继承 Hyperf\Database\Pool\Pool 或重写 Hyperf\Database\Connection 来插入钩子。这不是标准用法,但适合强监控场景:
- 新建自定义连接类,覆写
connect()方法,在底层 PDO 构建后执行你的初始化逻辑(如打点、注册协程 defer 清理) - 在
disconnect()中记录连接释放时间与空闲时长 - 需在
config/autoload/databases.php中将class配置项指向你的连接类
不需要监听虚无缥缈的“连接事件”,关注 SQL 执行、心跳反馈和连接实例生命周期,就能准确掌握 MySQL 连接的真实状态。

















