代碼中定義map變量保存映射關(guān)系,偶爾出現(xiàn)一種情況,machineConnectionMap與connectionMachineMap的數(shù)據(jù)不對(duì)等,比如machineConnectionMap為[1=>2],connectionMachineMap為[1=>2,2=>3],machineConnectionMap中少了一條映射。
整個(gè)代碼中僅在onClose中有unset掉map,對(duì)于這個(gè)問(wèn)題有點(diǎn)莫名其秒,完全不知道從哪里下手排查。
PS:因?yàn)閼?yīng)用很簡(jiǎn)單,所以只開(kāi)了一個(gè)進(jìn)程(即處理連接又處理業(yè)務(wù),也只能開(kāi)一個(gè)進(jìn)程,否則多進(jìn)程內(nèi)map數(shù)據(jù)得不到共享)
class Serve {
/**
* 當(dāng)連接建立時(shí)觸發(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)連接斷開(kāi)時(shí)觸發(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變量
});
}
}