答案:通过 $server->connections 获取 Swoole 当前活跃连接的 fd 列表,结合 isEstablished 和 connection_info 可管理连接状态,适用于广播、监控等场景。

在 Swoole 中,获取服务器当前的连接列表可以通过 server->connections 属性来实现。这个属性是一个只读数组,保存了当前所有活跃的客户端连接的文件描述符(即 $fd)。
1. server->connections 的基本使用
该属性返回一个包含所有活动连接 $fd 的迭代数组。你可以遍历它来获取每个连接的信息。
示例代码:
$server = new SwooleServer("0.0.0.0", 9501); $server->on('connect', function ($server, $fd) { echo "客户端 {$fd} 已连接n"; }); $server->on('receive', function ($server, $fd, $reactor_id, $data) { // 获取当前所有连接 $clients = $server->connections; echo "当前连接数: " . count($clients) . "n"; foreach ($clients as $client_fd) { echo "活跃连接 fd: {$client_fd}n"; } $server->send($fd, "已收到消息n"); }); $server->start();
2. 注意事项和限制
Swoole 的连接列表仅保存 TCP 层面的连接 $fd,不包括关闭中的或已断开的连接。以下几点需要注意:
- connections 是一个只读数组,不能手动修改
- 在多进程模式下,connections 只包含当前 Worker 进程所管理的连接(Swoole 4.5+ 支持全局连接表)
- 如果启用了 开启 reuseport 或多 Reactor,connections 仍能准确反映本进程的连接状态
- UDP 连接不会出现在 connections 中(UDP 是无连接的)
3. 获取更多连接信息
单纯获取 $fd 可能不够,你可能还需要判断某个连接是否有效,或获取其相关信息。
可以结合以下方法使用:
- $server->connection_info($fd):获取指定连接的详细信息,如来自哪个 reactor、连接时间、协议类型等
- $server->isEstablished($fd):判断某个 $fd 是否为有效的 TCP 连接(适用于 WebSocket)
示例:过滤出有效的 WebSocket 连接
foreach ($server->connections as $fd) { if ($server->isEstablished($fd)) { echo "有效连接: {$fd}n"; $info = $server->connection_info($fd); print_r($info); } }
4. 实际应用场景
常见用途包括:
- 向所有客户端广播消息
- 监控当前在线用户数
- 主动踢掉某个异常连接
- 实现心跳检测与超时管理
广播示例:
foreach ($server->connections as $fd) { if ($server->isEstablished($fd)) { $server->send($fd, "系统通知:即将重启服务!"); } }
基本上就这些。只要记住用 $server->connections 拿到所有 $fd,再配合 connection_info 和 isEstablished 判断状态,就能灵活管理连接列表。


