目前希望通過 不同的域名解析到同一個gateway 的地址, 希望通過onWebSocketConnect 獲取$_SERVER 信息做來源識別。但是遇到如下的情況:
onWebSocketConnect 只能在 Gateway 或者 BusinessEvent 其中一個地方觸發(fā)。
在 Gateway onConnect 的時(shí)候設(shè)置 onWebSocketConnect,設(shè)置$_SESSION 數(shù)據(jù),但是 BusinessEvent里面無法獲取到設(shè)置的$_SESSION數(shù)據(jù)。
在BusinessEvent里面設(shè)置的話,Gateway則不能存在onConnect和onWebSocketConnect,另外里面有一個BINARY_TYPE_ARRAYBUFFER 不知道在 BusinessEvent 是否可以設(shè)置,如何設(shè)置?
$connection->websocketType = Workerman\Protocols\Websocket::BINARY_TYPE_ARRAYBUFFER;
更新問題1的根因和解決方式:
SESSION實(shí)際上是有傳遞的,我這里沒有獲取到的原因是設(shè)置$_SESSION沖突(不知道是否為框架的bug)
我在business里面的 onConnect 有設(shè)置$_SESSION['connect_time'] = xxx。此處經(jīng)調(diào)試,是會和 Gateway里面的onWebSocketConnect設(shè)置$_SESSION變量產(chǎn)生沖突,有點(diǎn)類似誰后執(zhí)行,就會完全覆蓋整個$_SESSION的值
1、如果在gateway和events兩邊同時(shí)分別設(shè)置session,據(jù)我了解,events里的session會整體覆蓋掉gateway設(shè)置的session【框架里對過期的session處理用的是setSocketSession()】;
2、我本地嘗試擴(kuò)展了一個方法:
\GatewayWorker\Lib\Gateway::mergeSocketSession(Context::$client_id, $session_str_now);
替換掉了框架里/src/BusinessWorker.php原來的調(diào)用:
\GatewayWorker\Lib\Gateway::setSocketSession(Context::$client_id, $session_str_now);
經(jīng)多次測試,暫未發(fā)現(xiàn)什么問題,你可以自己試試看,有2-3個文件都得同步修改下。
3、不過這到底是不是BUG,還是基于其他什么因素考慮,我不好說,還得等老大確定;