【已解决】onWebSocketConnect 和 SESSION 传递的问题

jackyxie

目前希望通过 不同的域名解析到同一个gateway 的地址, 希望通过onWebSocketConnect 获取$_SERVER 信息做来源识别。但是遇到如下的情况:

  1. onWebSocketConnect 只能在 Gateway 或者 BusinessEvent 其中一个地方触发。
    在 Gateway onConnect 的时候设置 onWebSocketConnect,设置$_SESSION 数据,但是 BusinessEvent里面无法获取到设置的$_SESSION数据。

  2. 在BusinessEvent里面设置的话,Gateway则不能存在onConnect和onWebSocketConnect,另外里面有一个BINARY_TYPE_ARRAYBUFFER 不知道在 BusinessEvent 是否可以设置,如何设置?
    $connection->websocketType = Workerman\Protocols\Websocket::BINARY_TYPE_ARRAYBUFFER;

更新问题1的根因和解决方式:
SESSION实际上是有传递的,我这里没有获取到的原因是设置$_SESSION冲突(不知道是否为框架的bug)
我在business里面的 onConnect 有设置$_SESSION['connect_time'] = xxx。此处经调试,是会和 Gateway里面的onWebSocketConnect设置$_SESSION变量产生冲突,有点类似谁后执行,就会完全覆盖整个$_SESSION的值

阅读 1101
1个回答

blogdaren

1、如果在gateway和events两边同时分别设置session,据我了解,events里的session会整体覆盖掉gateway设置的session【框架里对过期的session处理用的是setSocketSession()】;
2、我本地尝试扩展了一个方法:

\GatewayWorker\Lib\Gateway::mergeSocketSession(Context::$client_id, $session_str_now);

替换掉了框架里/src/BusinessWorker.php原来的调用:

 \GatewayWorker\Lib\Gateway::setSocketSession(Context::$client_id, $session_str_now);

经多次测试,暂未发现什么问题,你可以自己试试看,有2-3个文件都得同步修改下。
3、不过这到底是不是BUG,还是基于其他什么因素考虑,我不好说,还得等老大确定;

  • 暂无评论