最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Swoole v4.7 版本新特性预览之 onDisconnect 事件回调

    正文概述 转载于:掘金(沈唁)   2021-05-31   495

    文章首发自Swoole官方问答Swoole v4.7 版本新特性预览之 onDisconnect 事件回调。

    在之前的版本中可能有这样一种情况,在 WebSocket 服务器中无法在 close 事件回调中区分该 fd 是否为 WebSocket 连接,例如以下代码:

    //创建WebSocket Server对象,监听0.0.0.0:9501端口
    $ws = new Swoole\WebSocket\Server('0.0.0.0', 9501);
    
    //监听WebSocket连接打开事件
    $ws->on('Open', function ($ws, $request) {
        $ws->push($request->fd, "hello, welcome\n");
    });
    
    //监听WebSocket消息事件
    $ws->on('Message', function ($ws, $frame) {
        echo "Message: {$frame->data}\n";
        $ws->push($frame->fd, "server: {$frame->data}");
    });
    
    //监听WebSocket连接关闭事件
    $ws->on('Close', function ($ws, $fd) {
        echo "client-{$fd} is closed\n";
    });
    
    $ws->start();
    

    启动服务后,使用浏览器对127.0.0.1:9501发起请求,终端会得到输出:

    client-1 is closed
    [2021-05-24 16:58:08 *37715.1]  NOTICE  end (ERRNO 1005): session[1] is closed
    

    这样的输出并不能知道这个$fd1的连接是否为 WebSocket 连接。如果业务代码中存在直接使用该$fd去做一些逻辑处理是无用的,也有可能会发生有人恶意请求导致占用资源。

    那么熟悉 Swoole 开发的人就会想到可以增加判断:使用 getClientInfo 方法的websocket_status值来获取 WebSocket 连接状态

    当服务器是 WebSocket\Server 时, getClientInfo 会额外增加websocket_status信息,它有对应的 4 种状态,分别为

    常量对应值说明
    WEBSOCKET_STATUS_CONNECTION1连接进入等待握手WEBSOCKET_STATUS_HANDSHAKE2正在握手WEBSOCKET_STATUS_ACTIVE3已握手成功等待浏览器发送数据帧WEBSOCKET_STATUS_CLOSING4连接正在进行关闭握手,即将关闭

    可以修改上述代码中的 onClose 回调:

    $ws->on('Close', function ($ws, $fd) {
        $is_websocket = $ws->getClientInfo($fd)['websocket_status'];
        if ($is_websocket) {
            echo "client-{$fd} is closed, WebSocket status is {$is_websocket}\n";
        } else {
            echo "client-{$fd} is not a valid WebSocket connection\n";
        }
    });
    

    WebSocket\Server 还可以设置onRequest回调,同理增加:

    $ws->on('request', function (Swoole\Http\Request $request, Swoole\Http\Response $response) {
        if (isset($request->get['close'])) {
            $response->close();
        }
    });
    

    重启服务器,分别使用 WebSocket 客户端来请求后关闭和浏览器请求 http://127.0.0.1:9501/?close=1 后会得到这样的输出:

    client-1 is closed, WebSocket status is 3
    client-2 is not a valid WebSocket connection
    

    现在从 v4.7.0 版本开始,增加了 onDisconnect 事件回调,在上述代码中增加:

    //监听WebSocket错误的连接关闭事件
    $ws->on('Disconnect', function ($ws, $fd) {
        echo "client-{$fd} is Disconnect\n";
    });
    

    重启服务器,发起请求会得到:

    client-1 is closed, WebSocket status is 3
    client-2 is Disconnect
    

    这样就可以直接来区分连接是否为 WebSocket 连接。

    WebSocket\Server设置了 onDisconnect 事件回调,非 WebSocket 请求或者在 onRequest 调用 $response->close() 方法,都会回调onDisconnect。而在 onRequest 事件中正常结束则不会调用onCloseonDisconnect事件。

    反之,如果不设置 onDisconnect 事件回调,非 WebSocket 请求或者在 onRequest 调用 $response->close() 方法,则都会调用onClose回调。


    起源地下载网 » Swoole v4.7 版本新特性预览之 onDisconnect 事件回调

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元