在gateway onWebSocketConnect() 中啟動了一個AsyncTcpConnection 異步長連接。然后將對象保存到變量中。
類似下邊這種
self::$aliWsArr[$client_id] = new AsyncTcpConnection('ws://dashscope.aliyuncs.com/api-ws/v1/inference');
然后gateway 客戶端關(guān)閉連接的時候。通過self::$aliWsArr[$client_id] 關(guān)閉 AsyncTcpConnection 不生效。
public static function onClose($client_id)
{
echo "client_id closed: " . $client_id;
$key0 = self::$getTaskIdByClientId . $client_id;
$taskId = Redis::get($key0);
//結(jié)束task
if (isset(self::$aliWsArr[$client_id]) && $taskId) {
self::finishTaskMessage(self::$aliWsArr[$client_id], $taskId);
self::stopHeartbeat(self::$aliWsArr[$client_id]);
}
//刪除client 和 taskId 映射
Redis::del($key0);
}
這種問題要自己記錄詳細(xì)日志排查
每個ws 里邊的時間都記錄的有日志。 下邊代碼在gateway onWebSocketConnect 中
self::$aliWsArr[$client_id]->onConnect = function ($ws) use ($client_id) {
self::$canSendAudio[$client_id] = false; // 初始化
echo "connected success:aliws:" . $ws->id . ",client_id:" . $client_id . "\n";
//開啟任務(wù)
$taskId = uniqid();
$key = self::$getTaskIdByClientId . $client_id;
Redis::setEx($key, 3600, $taskId);
$ws->send(json_encode(self::sendRunTaskData($taskId)));
//給asr 發(fā)送消息
self::$sendAsrTimerIds[$client_id] = Timer::add(
0.05,
function () use ($client_id) {
if (!isset(self::$canSendAudio[$client_id])) {
return true;
}
$channel = self::$sendAliyunChan;
$data = $channel->pop();
if ($data) {
self::handleAliyunEventMessage($data, $client_id);
}
},
);
};
// 當(dāng)收到消息時
self::$aliWsArr[$client_id]->onMessage = function ($ws, $msg) use ($client_id) {
var_dump("ali 返回消息", $msg);
$data = json_decode($msg, true);
self::handleDashScopeMessage($data, $client_id);
};
self::$aliWsArr[$client_id]->onClose = function ($ws) use ($client_id) {
echo "ars close:" . $ws->id . ",client_id:" . $client_id . "\n";
//關(guān)閉阿里云和瀏覽器映射
unset(self::$aliWsArr[$client_id]);
//關(guān)閉開始音頻處理
unset(self::$canSendAudio[$client_id]);
//刪除給asr發(fā)送消息的定時器
if (isset(self::$sendAsrTimerIds[$client_id])) {
Timer::del(self::$sendAsrTimerIds[$client_id]);
unset(self::$sendAsrTimerIds[$client_id]);
}
};
self::$aliWsArr[$client_id]->onError = function ($ws, $code, $msg) {
echo "Error code:$code msg:$msg\n";
};
self::$aliWsArr[$client_id]->connect();