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

成員變量數(shù)據(jù)映射不一致

z985342160

問題描述

代碼中定義map變量保存映射關(guān)系,偶爾出現(xiàn)一種情況,machineConnectionMap與connectionMachineMap的數(shù)據(jù)不對等,比如machineConnectionMap為[1=>2],connectionMachineMap為[1=>2,2=>3],machineConnectionMap中少了一條映射。

整個代碼中僅在onClose中有unset掉map,對于這個問題有點莫名其秒,完全不知道從哪里下手排查。

PS:因為應(yīng)用很簡單,所以只開了一個進(jìn)程(即處理連接又處理業(yè)務(wù),也只能開一個進(jìn)程,否則多進(jìn)程內(nèi)map數(shù)據(jù)得不到共享)

class Serve {
/**
     * 當(dāng)連接建立時觸發(fā)的回調(diào)函數(shù)
     */
    public function onConnect($connection)
    {
        $this->logInfo('新連接:' . $connection->id, 'connection.new');

        /** @param TcpConnection $connection */
        $connection->onWebSocketConnect = function($connection) {
            $machine = $_GET['machine_id'];

            $this->machineConnectionMap[$machine->id] = $connection->id;
            $this->connectionMachineMap[$connection->id] = $machine->id;
            $this->connections[$connection->id] = $connection;
        };
    }

    /**
     * 當(dāng)連接斷開時觸發(fā)的回調(diào)函數(shù)
     *
     * @param $connection
     */
    public function onClose($connection)
    {
        if (isset($this->connectionMachineMap[$connection->id])) {
            $machineId = $this->connectionMachineMap[$connection->id];

            unset($this->machineConnectionMap[$machineId]);
            unset($this->connectionMachineMap[$connection->id]);
        }

        unset($this->connections[$connection->id]);
    }

    public function onWorkerStart($worker)
    {
        Timer::add(3, function () {
            // 有在這里調(diào)用$this方法使用map變量
        });
    }
}
268 1 0
1個回答

超高級的稻姬

同一個machine_id 可能會從不同的兩個客戶端連入吧?所以就可能會出現(xiàn)多個connection 對應(yīng)同一個 machine_id 的情況,當(dāng)其中一個 connection 關(guān)閉的時候就會把 machine_id 刪除,另一個 connection 對應(yīng)的 machine_id 就變成空了

??