sukerd / swoft-websocket-beautify
swoft/websocket-server 的补充与封装
Requires
- swoft/framework: ~2.0.0
This package is auto-updated.
Last update: 2024-03-27 18:24:44 UTC
README
目录
- 概述
- 环境需求
- 安装
- 使用
4.1. 将fd与uid绑定
4.2. 按uid解绑
4.3. 按fd解绑
4.4. 判断fd是否在线
4.5. 获取当前uid全部所在线连接数量
4.6. 向uid绑定的所有在线fd发送数据
4.7. 发送给某个fd客户端
4.8. 按uid获取fd
4.9. 获取全局所有uid-fd列表
4.10. 按fd获取uid
4.11. 获取全局所有fd-uid列表
1. 概述
- swoft/websocket-server 的补充与封装,因业务需要封装了一下,后来觉得可以抽离并开源出来为swoft生态贡献我卑微的一点力量:grimacing:(极其简单,大佬勿喷)
(在此感谢swoft框架作者@stelin提供如此优秀的框架,也感谢workerman框架作者@walkor提供的思路) - 使用Redis hash实现的进程间共享内存 (为什么不用swoole table?因为无法动态扩容,与需求相驳)
- 现目前为开发测试版本,正待上线测试,但就目前测试结果来说并无问题
- 如有更好解决方案,烦请大佬指点
2. 环境需求
2.1. 必须swoft
2.2. swoft必须>2.0
2.3. 最不可少swoft/websocket-server
3. 安装
composer require sukerd/swoft-websocket-beautify:dev-master
4. 使用
说明
下文不再做解释
$uid 这里uid泛指用户id或者设备id,用来唯一确定一个客户端用户或者设备
$fd 是与客户端的连接 ID,它表明了不同的客户端
如果想实现分组啥的还请自行实现,因为我目前的业务暂时用不到(其实也挺简单:grimacing:),后续有需求了再说吧 :joy:
4.1. 将fd与uid绑定
public static function bindUid(string $uid, int $fd = 0): bool
参数说明:
$uid string 需要绑定的uid
$fd int 需要绑定的fd (非必须,默认为本次连接fd)
方法说明:
1. uid与fd是一对多的关系,允许一个uid下有多个fd。
2. 一个fd只能绑定一个uid,如果绑定多次uid,则只有最后一次绑定有效。
3. 如果业务需要一对一的关系,Beautify::getFd($uid)获得某uid已经绑定的所有fd,然后调用 Session::mustGet()->getServer()->disconnect($fd)踢掉之前的fd
4. 因为使用Redis hash实现的进程间共享内存,如果服务端产生异常(如:stop、restart、等等)会导致之前产生的绑定数据依然留存于缓存中,但是不用担心程序重启后数据冲突的问题,一旦fd重新上线并进行绑定,Beautify会自己处理因意外原因遗留被绑定的uid、fd并解绑
示例:
Beautify::bindUid('10000');
4.2. 按uid解绑
public static function unbindUid(string $uid, int $fd = 0): void
参数说明:
$uid string
$fd int 非必须,指定解绑某个fd,如果默认则解绑全部
示例:
Beautify::unbindUid('10000', 1);
4.3. 按fd解绑
public static function unbindFd(int $fd): void
参数说明:
$fd int
方法说明:
fd下线(连接断开)时不会自动执行解绑,开发者必需调用Beautify::unbindFd($fd)解绑。
示例:
Beautify::unbindFd(1);
4.4. 判断fd是否在线
public static function isOnline(int $fd): bool
参数说明:
$fd int
方法说明:
1.检查连接是否为有效的WebSocket客户端连接
2.如果是客户端断网断电等极端情况掉线,服务端就无法得知连接已经断开,需自己实现心跳检测*(如果不知道请自行面向百度编程)*
示例:
Beautify::isOnline(1);
4.5. 获取当前uid全部所在线连接数量
public static function isUidOnline(string $uid): int
参数说明:
$uid string
方法说明:
1.检查uid被绑定的fd连接是否为有效的WebSocket客户端连接并返回有效连接数
2.如果是客户端断网断电等极端情况掉线,服务端就无法得知连接已经断开,需自己实现心跳检测*(如果不知道请自行面向百度编程)*
示例:
Beautify::isUidOnline('10000');
4.6. 向uid绑定的所有在线fd发送数据
public static function sendToUid(string $uid, string $data): int
参数说明:
$uid string
$data string
方法说明:
默认uid与fd是一对多的关系,如果当前uid下绑定了多个fd,则多个fd对应的客户端都会收到消息
示例:
Beautify::sendToUid('10000', 'hi, swoft!');
4.7. 发送给某个fd客户端
public static function sendToFd(int $fd, string $data): bool
参数说明:
$fd int
$data string
示例:
Beautify::sendToFd(1, 'hi, swoft!');
4.8. 按uid获取fd
public static function getFd(string $uid): array
参数说明:
$uid string
方法说明:
按uid获取与之绑定的fd
示例:
vdump(Beautify::getFd('10000')); // [1,2,3]
4.9. 获取全局所有uid-fd列表
public static function getAllUidFd(): array
方法说明:
获取全局所有uid-fd列表
示例:
vdump(Beautify::getAllUidFd()); // ['10000'=>'1,2,3' ,'10001'=>'4']
4.10. 按fd获取uid
public static function getUid(string $fd): string
参数说明:
$fd string
方法说明:
按fd获取与之绑定的uid
示例:
vdump(Beautify::getFd('10000')); // [1,2,3]
4.11. 获取全局所有fd-uid列表
public static function getAllFdUid(): array
方法说明:
获取全局所有fd-uid列表
示例:
vdump(Beautify::getAllFdUid()); // [1 => '10000', 2 => '10000', 3 => '10000', 4 => '10001']