常用的Swoole函数

  

官方文档地址

 

 

getClientInfo()

获取连接的信息,别名是 Swoole\Server->connection_info()

Swoole\Server->getClientInfo(int $fd, int $extraData, bool $ignoreError = false): bool|array
  • 参数

    • int $fd

      • 功能:指定文件描述符
      • 默认值:无
      • 其它值:无
    • int $extraData

      • 功能:扩展信息,保留参数,目前无任何效果
      • 默认值:无
      • 其它值:无
    • bool $ignoreError

      • 功能:是否忽略错误,如果设置为 true,即使连接关闭也会返回连接的信息
      • 默认值:无
      • 其它值:无
  • 提示

    • 客户端证书

      • 仅在 onConnect 触发的进程中才能获取到证书
      • 格式为 x509 格式,可使用 openssl_x509_parse 函数获取到证书信息
    • 当使用 dispatch_mode = 1/3 配置时,考虑到这种数据包分发策略用于无状态服务,当连接断开后相关信息会直接从内存中删除,所以 Server->getClientInfo 是获取不到相关连接信息的。

  • 返回值

    • 调用失败返回 false
    • 调用成功返回 array
$fd_info = $server->getClientInfo($fd);
var_dump($fd_info);

array(7) {
  ["reactor_id"]=>
  int(3)
  ["server_fd"]=>
  int(14)
  ["server_port"]=>
  int(9501)
  ["remote_port"]=>
  int(19889)
  ["remote_ip"]=>
  string(9) "127.0.0.1"
  ["connect_time"]=>
  int(1390212495)
  ["last_time"]=>
  int(1390212760)
}
参数作用
reactor_id 来自哪个 Reactor 线程
server_fd 来自哪个监听端口 socket,这里不是客户端连接的 fd
server_port 来自哪个监听端口
remote_port 客户端连接的端口
remote_ip 客户端连接的 IP 地址
connect_time 客户端连接到 Server 的时间,单位秒,由 master 进程设置
last_time 最后一次收到数据的时间,单位秒,由 master 进程设置
close_errno 连接关闭的错误码,如果连接异常关闭,close_errno 的值是非零,可以参考 Linux 错误信息列表
recv_queued_bytes 等待处理的数据量
send_queued_bytes 等待发送的数据量
websocket_status [可选项] WebSocket 连接状态,当服务器是 Swoole\WebSocket\Server 时会额外增加此项信息
uid [可选项] 使用 bind 绑定了用户 ID 时会额外增加此项信息
ssl_client_cert [可选项] 使用 SSL 隧道加密,并且客户端设置了证书时会额外添加此项信息

getClientList()

遍历当前 Server 所有的客户端连接,Server::getClientList 方法是基于共享内存的,不存在 IOWait,遍历的速度很快。另外 getClientList 会返回所有 TCP 连接,而不仅仅是当前 Worker 进程的 TCP 连接。别名是 Swoole\Server->connection_list()

Swoole\Server->getClientList(int $start_fd = 0, int $pageSize = 10): bool|array
  • 参数

    • int $start_fd

      • 功能:指定起始 fd
      • 默认值:无
      • 其它值:无
    • int $pageSize

      • 功能:每页取多少条,最大不得超过 100
      • 默认值:无
      • 其它值:无
  • 返回值

    • 调用成功将返回一个数字索引数组,元素是取到的 $fd。数组会按从小到大排序。最后一个 $fd 作为新的 start_fd 再次尝试获取
    • 调用失败返回 false
  • 提示

    • 推荐使用 Server::$connections 迭代器来遍历连接
    • getClientList 仅可用于 TCP 客户端,UDP 服务器需要自行保存客户端信息
    • SWOOLE_BASE 模式下只能获取当前进程的连接
  • 示例

$start_fd = 0;
while (true) {
  $conn_list = $server->getClientList($start_fd, 10);
  if ($conn_list === false or count($conn_list) === 0) {
      echo "finish\n";
      break;
  }
  $start_fd = end($conn_list);
  var_dump($conn_list);
  foreach ($conn_list as $fd) {
      $server->send($fd, "broadcast");
  }
}

Swoole\WebSocket\Frame

在 v4.2.0 版本中,新增了服务端和客户端发送 Swoole\WebSocket\Frame 对象的支持
在 v4.4.12 版本中,新增了 flags 属性以支持 WebSocket 压缩帧,同时增加了一个新的子类 Swoole\WebSocket\CloseFrame

一个普通的 frame 对象具有以下属性

object(Swoole\WebSocket\Frame)#1 (4) {
  ["fd"]      =>  int(0)
  ["data"]    =>  NULL
  ["opcode"]  =>  int(1)
  ["finish"]  =>  bool(true)
}

Swoole\WebSocket\CloseFrame

一个普通的 close frame 对象具有以下属性,多了 code 和 reason 属性,记录了关闭的错误代码和原因,code 可在 websocket 协议中定义的错误码 查询,reason 若是对端没有明确给出,则为空

如果服务端需要接收 close frame, 需要通过 $server->set 开启 open_websocket_close_frame 参数

object(Swoole\WebSocket\CloseFrame)#1 (6) {
  ["fd"]      =>  int(0)
  ["data"]    =>  NULL
  ["finish"]  =>  bool(true)
  ["opcode"]  =>  int(8)
  ["code"]    =>  int(1000)
  ["reason"]  =>  string(0) ""
}

在用于发送时,fd 属性会被忽略 (因为服务器端 fd 是第一个参数,客户端无需指定 fd), 所以 fd 是一个只读属性

exist

判断 WebSocket 客户端是否存在,并且状态为 Active 状态。

v4.3.0 以后,此 API 仅用于判断连接是否存在,请使用 isEstablished 判断是否为 WebSocket 连接

Swoole\WebSocket\Server->exist(int $fd): bool



isEstablished

检查连接是否为有效的 WebSocket 客户端连接。

此函数与 exist 方法不同,exist 方法仅判断是否为 TCP 连接,无法判断是否为已完成握手的 WebSocket 客户端。

Swoole\WebSocket\Server->isEstablished(int $fd): bool
  • 参数

    • int $fd

      • 功能:客户端连接的 ID【如果指定的 $fd 对应的 TCP 连接并非 WebSocket 客户端,将会发送失败】
      • 默认值:无
      • 其它值:无
 
posted @ 2020-11-11 09:17  xiaohe520  阅读(349)  评论(0编辑  收藏  举报