問題重現(xiàn):
模擬一客戶端成功與服務器建立連接
事先在 Events::onConnect 中調(diào)用 Gateway::bindUid
Events::onClose 中調(diào)用 Gateway::getUidByClientId
模擬斷開客戶端連接,結(jié)果 Gateway::getUidByClientId 返回空值null
[attach]1194[/attach]
問題調(diào)試:
如圖 return 斷點調(diào)試,發(fā)現(xiàn)能如期獲取到映射的uid, 個人理解原因是:
$this->sendToWorker 異步通知 Events,BusinessWorker異步收到轉(zhuǎn)發(fā)來的數(shù)據(jù),
導致 Events::onClose 業(yè)務邏輯可能尚未執(zhí)行,而斷點后的清理代碼已經(jīng)先行執(zhí)行完畢了,
不知道理解是否正確?如果理解正確,那么如題如何正確獲取到映射uid?
期望結(jié)果:
期望業(yè)務邏輯執(zhí)行完成后,再行斷點后的后續(xù)清理工作。
是的,連接斷開后Gateway會立刻清理對應連接的數(shù)據(jù),包括uid綁定數(shù)據(jù)。
在onClose回調(diào)中無法使用此接口,解決方法是bindUid時記錄一個$_SESSION=uid,Events::onClose的時候用$_SESSION來獲取uid。
但是仍然要注意$_SESSION一般是在onMessage/onWebSocketConnect里賦值的,但是onMessage/onWebSocketConnect在onClose調(diào)用前不一定會被調(diào)用,比如客戶端發(fā)起了tcp連接后未發(fā)送任何數(shù)據(jù)然后關閉了連接,類似這種情況服務端Events ::onClose回調(diào)中不會有$_SESSION值,所以Events::onClose中獲取$_SESSION值需要判斷下uid鍵值是否存在。
在手冊中有提到,onClose回調(diào)中無法使用此接口,按照手冊方法用session來獲得