答案:通过 $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 判断状态,就能灵活管理连接列表。
以上就是Swoole怎么获取服务器当前的连接列表的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/196564.html
微信扫一扫
支付宝扫一扫