用戶登錄成功后,我將用戶uid(唯一的)與client_id存放在一張表中(映射表)。當(dāng)該用戶再次登錄時,按workerman運行機(jī)制,客戶端連接到服務(wù)端,它又會自動生成一個client_id,當(dāng)用戶再次登錄時,發(fā)給原來的client_id的信息就不能發(fā)送給該用戶了?,F(xiàn)在問題就是能否用映射表中的client_id替換掉再次登錄workerman生成的client_id?還有client_id是在哪一步生成的?
workerman中得client_id無法自定義,每次客戶端連接workerman的那一時刻會生成一個新的全局唯一的clent_id。
如果你要加入uid的概念,可以做映射表,uid<->client_id,通訊的時候使用uid通訊,封裝一個類似Gateway::sendToUid($uid, $message)的接口,接口內(nèi)部實現(xiàn)就是通過uid查找client_id,然后調(diào)用workerman自己的Gateway::sendToClient($client_id, $message)發(fā)送
每次用戶登錄時把uid與client_id的映射關(guān)系寫入數(shù)據(jù)庫,用戶退出時通過client_id把映射記錄刪除。uid與client_id可以一對多(也就是同一個用戶支持多個客戶端同時登錄),也可以強(qiáng)制一對一(同一個用戶只能登錄一個客戶端)
GatewayWorker 增加了bindUid 和 sendToUid方法,可以直接使用,參見手冊
http://workerman.net/gatewaydoc/gateway-worker-development/bind-uid.html
http://workerman.net/gatewaydoc/gateway-worker-development/send-to-uid.html
每個連接client_id不一樣,一樣的話就亂套了,因為沒有數(shù)據(jù)交互無法確定一個新的socket連接是屬于某個client_id。client_id生成機(jī)制類似自增機(jī)制。bindUid一般是客戶端連接上來后發(fā)一個驗證包,驗證自己是哪個uid,然后和當(dāng)前client_id綁定。
判斷用戶是否在線可以使用$mes = Gateway::getClientIdByUid($uid); 根據(jù)用戶uid可以實時查出用戶的clientid