Server->getClientInfo

Server->getClientInfo函数用来获取连接的信息,别名是Server->connection_info

函数原型

bool|array Server->getClientInfo(int $fd, int $extraData, bool $ignoreError = false)

参数

  • $fd:客户端连接的fd
  • $extraData:扩展信息,保留参数,目前无任何效果
  • $ignoreError 是否忽略错误,如果设置为true,即使连接关闭也会返回连接的信息

返回值

  • 如果传入的$fd存在,将会返回一个数组
  • 连接不存在或已关闭,返回false

当使用dispatch_mode=1/3配置时,考虑到这种数据包分发策略用于无状态服务,当连接断开后相关信息会直接从内存中删除,所以Server->getClientInfo是获取不到相关连接信息的。

$fdinfo = $serv->getClientInfo($fd);
var_dump($fdinfo);
array(5) {
  ["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错误信息列表
  • websocket_status [可选项] WebSocket连接状态,当服务器是Swoole\WebSocket\Server时会额外增加此项信息
  • uid [可选项] 使用bind绑定了用户ID时会额外增加此项信息
  • ssl_client_cert [可选项] 使用SSL隧道加密,并且客户端设置了证书时会额外添加此项信息

客户端证书

  • 仅在onConnect触发的进程中才能获取到证书
  • 格式为x509格式,可使用openssl_x509_parse函数获取到证书信息


  • 杨润林

    $fd会一直自动增加,这样正常吗?长时间运行服务器会不会导致$fd溢出?

  • OH

    我也是这样,正常吗?

  • 1231

    能否实现可以增加属性?比如存储客户端的业务唯一ID,这样发送时直接根据ID能找到fd 发送,不用再自己维护一个对应关系

  • 拼个Léon

    怎么标记一个连接为已登录:目的是已登录的用户在一个worker中处理其消息,未登录的在另外一个线程处理。

    是不是必须借助 swoole_table 等来实现?

    如果有setClientInfo(key, value)那就容易了

  • jichengyang

    conncet_time 连接时间和客户端、服务端相差几个小时