代码中定义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变量
});
}
}