连接分组
优质
小牛编辑
132浏览
2023-12-01
imi 支持对 WebSocket 的连接(fd)进行逻辑分组,你可以方便地对用户进行分组消息推送。
所有的分组针对服务器,所以需要 imi 的服务器对象才可以调用下面这些方法,比如在WebSocketController
中可以使用$this->server
。
分组的使用
配置
服务器配置文件:
[
'beans' => [
// 分组
'ServerGroup' => [
'status' => true , // 启用
'groupHandler' => 'GroupRedis', // 分组处理器,目前仅支持 Redis
],
// 分组 Redis 驱动
'GroupRedis' => [
'redisPool' => '连接池名',
'redisDb' => 0, // redis中第几个库
'heartbeatTimespan' => 5, // 心跳时间,单位:秒.
'heartbeatTtl' => 8, // 心跳数据过期时间,单位:秒.
'key' => null, // 该服务的分组键,默认为 imi:命名空间:connect_group
],
// 分组本地驱动,仅支持当前 Worker 进程
'GroupLocal' => [
// 无配置项
],
],
]
分组创建
// 创建一个分组
$this->server->createGroup('分组名称');
// 创建一个分组,最多允许加入10个连接,-1为不限制
$this->server->createGroup('分组名称', 10);
加入分组
$this->server->joinGroup('分组名称', $this->frame->getFd());
离开分组
$this->server->leaveGroup('分组名称', $this->frame->getFd());
连接是否存在于组里
$this->server->getGroup('分组名称')->isInGroup($this->frame->getFd());
获取所有连接
$this->server->getGroup('分组名称')->getFds();
获取在组中的连接总数
$this->server->getGroup('分组名称')->count();
获取分组对象
// 不存在则为null,否则为\Imi\Server\Group\Group对象
$this->server->getGroup('分组名称');
组是否存在
$this->server->hasGroup('分组名称');
调用组方法
// 遍历g1分组中所有fd,调用服务器的push方法,发送message
$this->server->groupCall('g1', 'push', 'message');
获取所有分组
$this->server->getGroups();
分组对象详解
类\Imi\Server\Group\Group
加入组
$group->join($fd);
离开组
$group->leave($fd);
获取服务器对象
当前分组属于哪个服务器,这个是Swoole的服务器对象。
$group->getServer();
获取最大客户端数量
$group->getMaxClients();
调用组方法
// 发送给组里所有的连接,其它服务器方法一样调用,省去fd参数即可
$group->push('message');