国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

請(qǐng)教下gateway-worker在線離線邏輯如何實(shí)現(xiàn)

suika

請(qǐng)教下各位大神,下方是我寫(xiě)的偽邏輯,看起來(lái)沒(méi)問(wèn)題,但實(shí)際設(shè)備上下線頻繁時(shí),在線狀況是錯(cuò)誤的,調(diào)試后發(fā)現(xiàn)是onMessageGateway::closeClient($id);的操作觸發(fā)onClose,是在onMessage后續(xù)將設(shè)備設(shè)置為在線之后。
也就是說(shuō),我在設(shè)備上線后,手動(dòng)斷開(kāi)老的連接,將狀態(tài)設(shè)置為離線,再將狀態(tài)設(shè)置為在線的操作由于onClose并不會(huì)馬上執(zhí)行導(dǎo)致順序反轉(zhuǎn)

function onMessage($client_id, $data){
    //獲取設(shè)備發(fā)送的業(yè)務(wù)ID
    $id = $data['id'];

    //如果之前已經(jīng)有在線的則踢掉,如意外掉線,心跳未斷掉的情況下
    $ids = Gateway::getClientIdByUid($id);
    foreach ($ids as $id) {
        Gateway::closeClient($id);
    }

    //存入$_SESSION,在onClose時(shí)判斷存在ID則離線
    $_SESSION['id'] = $id;

    //綁定client_id和業(yè)務(wù)ID
    Gateway::bindUid($client_id, $id);

    //持久化在線離線狀態(tài),例Redis
    Redis::hSet($id,'online', 1);

    //推送設(shè)備在線至客戶端
    Gateway::sendToGroup($id, 'online|1');
}

function onClose($client_id){
    if(isset($_SESSION['id'])){
        $id = $_SESSION['id']

        Redis::hSet($id,'online', 0);
        Gateway::sendToGroup($id, 'online|0');
    }
}
953 2 1
2個(gè)回答

Gin

截圖 把這段去掉呢

  • suika 2023-11-11

    去掉的話如果同一個(gè)設(shè)備老的連接還存在,新的連接上線(如意外掉線,沒(méi)主動(dòng)斷掉連接),會(huì)導(dǎo)致新的連接設(shè)置成了在線后因?yàn)槔系倪B接心跳停止又設(shè)置成離線
    我這里是想先把老連接主動(dòng)切斷

  • Gin 2023-11-11

    沒(méi)主動(dòng)斷掉連接 還掉線 你這個(gè)掉線怎么說(shuō)

  • suika 2023-11-11

    比如設(shè)備那里突然斷電是不會(huì)在斷電前主動(dòng)斷掉連接的,上電后是一條新的連接

  • Gin 2023-11-11

    那之前那個(gè)連接就不發(fā)心跳了, 服務(wù)端回主動(dòng)踢掉了

  • suika 2023-11-11

    是的,在心跳完全結(jié)束前,新的連接連進(jìn)來(lái)會(huì)設(shè)置為在線,心跳結(jié)束后在onClose又會(huì)設(shè)置成離線

  • Gin 2023-11-11

    我這邊client_id是存庫(kù)的 新連接上來(lái) client_id替換舊client_id 舊client_id 離線 處理離線會(huì)查不到之前的設(shè)備

  • suika 2023-11-11

    理解,但我是根據(jù)業(yè)務(wù)ID,設(shè)備每次連接時(shí)ID都是相同的,所以我想先把未斷掉心跳的連接主動(dòng)切斷后再設(shè)置成上線

  • Gin 2023-11-11

    業(yè)務(wù)id搭配 client_id 處理 我感覺(jué)會(huì)好些

  • suika 2023-11-11

    感謝回復(fù),我再研究一下~

suika

打算在onCloseisUidOnline,如果用業(yè)務(wù)ID能查到有在線的連接,就不設(shè)置為離線。
不知道在onClose里自己算不算在線連接,如果算話改用getClientIdByUid,感覺(jué)沒(méi)問(wèn)題。
各位有沒(méi)有更優(yōu)雅的方法~

  • 暫無(wú)評(píng)論
年代過(guò)于久遠(yuǎn),無(wú)法發(fā)表回答
??