连接分组

优质
小牛编辑
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');