代碼中定義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變量
});
}
}
同一個machine_id
可能會從不同的兩個客戶端連入吧?所以就可能會出現(xiàn)多個connection
對應(yīng)同一個 machine_id
的情況,當(dāng)其中一個 connection
關(guān)閉的時候就會把 machine_id
刪除,另一個 connection
對應(yīng)的 machine_id
就變成空了