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