常用的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客户端,将会发送失败】 - 默认值:无
- 其它值:无
- 功能:客户端连接的
-

浙公网安备 33010602011771号