webman 和 GatewayWorker 结合 获取webman中的session 已解决

shixia

直接贴代码

/**
 * 当客户端连接上gateway完成websocket握手时触发的回调函数。
 * @param client_id 来自注册中心的连接ID
 * @param data 连接的相关数据
 * @return void
 */
public static function onWebSocketConnect($client_id, $data)
{
    //检测Cookis中是否有sessionId 如果没有则踢下线;
    //建议还可以顺带拉黑掉ip我是还在测试所以还没写 
    //拉黑ip建议在nginx中检测就不要让他转发到webman中了
    $name = config('session.session_name');
    if (empty($data['cookie'][$name])) {
        Gateway::closeClient($client_id);
    }
            // $session 变量就是你在webman中的通过请求类获取到的session类 
    // 等同于 在webman中的 $request->session(); 
    //但是也不完全一样 如果sessionId不存在也不会自动创建
    $session = new \Workerman\Protocols\Http\Session($data['cookie'][$name]);
    if (empty($session->all())) { //验证是否session是否有数据
        Gateway::closeClient($client_id);
    }
}
2072 3 1
3个回答

shixia

有点裂开,没有办法么

  • li914 2022-03-14

    感觉是木有办法的,GatewayWorker 和 webman 是两种工作协议,客户端连接是不同的

admin

用redis,webman使用redis,然后gatewayworker也使用redis读取就行了。

webman下手动获取 当前用户session资源集

截图

  • Tinywan 2022-03-14

    推荐

  • shixia 2022-03-14

    我是用的redis我确实是可以获取到数据集,但是用哪个类解析数据集是个问题

  • shixia 2022-03-14

    webman中解析数据集的类我没找到有大佬找到的跟我说一下

  • admin 2022-03-15

    你可以在群里提,这里不方便细聊

  • admin 2022-03-15

    等群里大佬帮解决了,也来这里分享更进下,让其他人方便

抽不完的寂寞

拿到sessionid后,直接 new \Workerman\Protocols\Http\Session($session_id); 就能拿到session了吧。

  • shixia 2022-03-15

    不这个不是解析数据的类这个是整个seeion类其中有可能调用到了请求类的东西会有问题的

  • 抽不完的寂寞 2022-03-15

    看了源码,貌似没啥耦合,可以直接用。解析数据用的php自带的serialize 和 unserialize函数,没有用到什么解析数据类

  • shixia 2022-03-16

    嗷嗷谢谢大佬

  • shixia 2022-03-16

    解决了写到帖子里面了

年代过于久远,无法发表回答
×
🔝