成员变量数据映射不一致

z985342160

问题描述

代码中定义map变量保存映射关系,偶尔出现一种情况,machineConnectionMap与connectionMachineMap的数据不对等,比如machineConnectionMap为[1=>2],connectionMachineMap为[1=>2,2=>3],machineConnectionMap中少了一条映射。

整个代码中仅在onClose中有unset掉map,对于这个问题有点莫名其秒,完全不知道从哪里下手排查。

PS:因为应用很简单,所以只开了一个进程(即处理连接又处理业务,也只能开一个进程,否则多进程内map数据得不到共享)

class Serve {
/**
     * 当连接建立时触发的回调函数
     */
    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;
        };
    }

    /**
     * 当连接断开时触发的回调函数
     *
     * @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 () {
            // 有在这里调用$this方法使用map变量
        });
    }
}
43 0 0
0个回答

🔝