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

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

suika

請教下各位大神,下方是我寫的偽邏輯,看起來沒問題,但實際設(shè)備上下線頻繁時,在線狀況是錯誤的,調(diào)試后發(fā)現(xiàn)是onMessageGateway::closeClient($id);的操作觸發(fā)onClose,是在onMessage后續(xù)將設(shè)備設(shè)置為在線之后。
也就是說,我在設(shè)備上線后,手動斷開老的連接,將狀態(tài)設(shè)置為離線,再將狀態(tài)設(shè)置為在線的操作由于onClose并不會馬上執(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時判斷存在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');
    }
}
1055 2 1
2個回答

Gin

截圖 把這段去掉呢

  • suika 2023-11-11

    去掉的話如果同一個設(shè)備老的連接還存在,新的連接上線(如意外掉線,沒主動斷掉連接),會導(dǎo)致新的連接設(shè)置成了在線后因為老的連接心跳停止又設(shè)置成離線
    我這里是想先把老連接主動切斷

  • Gin 2023-11-11

    沒主動斷掉連接 還掉線 你這個掉線怎么說

  • suika 2023-11-11

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

  • Gin 2023-11-11

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

  • suika 2023-11-11

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

  • Gin 2023-11-11

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

  • suika 2023-11-11

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

  • Gin 2023-11-11

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

  • suika 2023-11-11

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

suika

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

  • 暫無評論
年代過于久遠,無法發(fā)表回答
??