Hyperf 中 WebSocket 连接不使用连接池,其在线数即 Swoole Server 的实时 TCP 连接数;推荐通过 ServerManager 获取 WebSocket server 实例并调用 stats()['connection_num'] 获取,该值轻量准确,基本等价于在线用户数。

Hyperf 中 WebSocket 连接本身不直接使用「连接池」,而是基于 Swoole 的协程 WebSocket Server 建立长连接,每个客户端对应一个独立的 WebSocket\Server\Frame 连接。因此,**没有传统意义上的“WebSocket 连接池连接数”概念**,但你可以获取当前活跃的 WebSocket 客户端连接总数。
获取当前 WebSocket 在线连接数
Hyperf 的 WebSocket Server 底层基于 Swoole WebSocket\Server,所有客户端连接都注册在 Swoole Server 实例中。可通过 ServerManager 获取底层 Swoole Server,并调用 connection_list() 或 stats() 获取连接信息:
-
推荐方式(准确、轻量):使用
$server->stats()['connection_num'],返回当前所有 TCP 连接数(包括握手未完成、已关闭但未回收的连接),对 WebSocket 场景基本等价于在线用户数; -
更精确方式(需过滤):遍历
$server->connection_list(),再对每个连接调用$server->isEstablished($fd)和$server->exist($fd),并确认该连接是否为 WebSocket 协议(可通过自定义 fd 标识或上下文判断,Hyperf 默认不额外标记,需自行维护); -
业务级统计(最可靠):在
onOpen时 +1,onClose时 -1,用Atomic或Channel(协程安全)维护全局计数器,避免依赖 Swoole 内部状态。
代码示例:通过 ServerManager 获取连接数
在任意协程上下文中(如 WebSocket Controller、Command 或定时任务中):
use Hyperf\Server\ServerManager;
$server = ServerManager::get('ws'); // 注意:服务名需与 config/autoload/server.php 中 WebSocket server 的 name 一致(默认为 'ws')
if ($server && $server->getServer()) {
$stats = $server->getServer()->stats();
$onlineCount = $stats['connection_num'] ?? 0;
var_dump('当前连接数:', $onlineCount);
}
注意事项
-
connection_num包含所有 TCP 连接,若服务同时运行 HTTP/HTTPS 等其他类型 server,需确保只查 WebSocket 对应的 server 实例; - Swoole 的
stats()是实时快照,无需加锁,性能开销极小; - 不要依赖
connection_list()的长度作为在线数——它可能包含已关闭但未触发onClose的连接(如异常断网),且频繁调用影响性能; - 如需按房间/用户维度统计,必须自行在
onOpen/onClose中维护 Map 结构(如Coroutine\Channel或Hyperf\Contract\ConnectionInterface配合 Redis)。
不复杂但容易忽略的是:Hyperf 的 WebSocket 不走连接池,它的“连接数”就是 Swoole Server 的实时 TCP 连接数,直接查 stats 最稳妥。


















