hyperf 微服务中无法直接获取连接池当前连接数,需通过prometheus指标、底层状态或日志间接监控;推荐查hyperf_db_pool_connections_total和hyperf_redis_pool_connections_total等指标,辅以exporter对比验证,调试时可用反射或swoole_get_local_socket_count()估算,grpc则需关注clientconn实例数。

Hyperf 微服务中不能直接“获取”连接池当前连接数,因为官方组件(如 hyperf/database、hyperf/redis)未暴露实时连接计数的公共 API。但可通过监控指标、底层状态或日志方式间接掌握真实连接占用情况。
查 Prometheus 暴露的连接池指标
这是最推荐、生产可用的方式。Hyperf 集成 hyperf/metric 后,数据库和 Redis 连接池会自动上报以下关键指标:
-
数据库连接池:
hyperf_db_pool_connections_total{pool="default",state="idle"}和state="used"—— 分别表示空闲与已用连接数 -
Redis 连接池:
hyperf_redis_pool_connections_total{pool="cache",state="idle"}和state="used" - 需搭配
mysqld_exporter或redis_exporter使用,才能对比看到「PHP 层连接数」与「MySQL/Redis 实际接受连接数」是否一致,避免连接泄漏被掩盖
读取 Swow 或 Swoole 底层连接状态(仅限调试)
当使用 Swow 引擎(SWOW_BASE)时,可临时通过反射访问连接池内部状态(不建议线上长期调用):
- 数据库连接池实例(如
Hyperf\Database\Pool\Pool)包含$this->connections数组,但它是私有属性且含协程上下文关联对象,不能直接计数 - 更安全的做法是:在
OnWorkerStart中为每个连接池注册自定义指标收集器,用原子计数器统计acquire/release次数,推送到Gauge类型指标 - Swoole 模式下可通过
swoole_get_local_socket_count()查看当前进程 TCP 连接总数,减去 HTTP/WebSocket 等连接后粗略估算 DB/Redis 连接规模
启用连接池 debug 日志观察连接行为
临时开启详细日志,辅助判断连接是否复用、是否频繁新建:
- 数据库:在
config/autoload/databases.php的对应 pool 配置中加'logger' => ['level' => 'debug'] - Redis:确保
hyperf/redis版本 ≥ 3.2.5,配置'handler' => SwowHandler::class后,日志中会出现[INFO] Acquired connection from pool "cache"和[INFO] Released connection to pool "cache" - 注意:高频 debug 日志会影响性能,仅用于问题排查期开启
gRPC 客户端连接数要单独看 ClientConn 实例数
gRPC 不走传统连接池机制,其连接数取决于 *grpc.ClientConn 实例数量:
- 若每个 Controller 都 new 一个 client,就会生成多个 conn → 连接爆炸
- 正确做法是预创建固定大小连接池(如 4 个
ClientConn),所有 gRPC client 复用这组实例 - 验证方式:在 Worker 启动后打印
count($pool->getConnections())(需你自定义池暴露该方法),或用lsof -p {worker_pid} | grep :{target_port}查看实际 TCP 连接数











