信息发布→ 登录 注册 退出

Swoole怎么获取服务器当前的连接列表

发布时间:2025-09-24

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

在 Swoole 中,获取服务器当前的连接列表可以通过 server->connections 属性来实现。这个属性是一个只读数组,保存了当前所有活跃的客户端连接的文件描述符(即 $fd)。

1. server->connections 的基本使用

该属性返回一个包含所有活动连接 $fd 的迭代数组。你可以遍历它来获取每个连接的信息。

示例代码:

$server = new Swoole\Server("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_infoisEstablished 判断状态,就能灵活管理连接列表。
标签:# react  # websocket  # swoole  # udp  # 是一个  # 适用于  # 客户端  # 你可以  # 就能  # 出现在  # 遍历  # 可以通过  # 相关信息  # 还需要  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!