workerman gateway close() 关闭

bot

问题描述

在gateway onWebSocketConnect() 中启动了一个AsyncTcpConnection 异步长连接。然后将对象保存到变量中。
类似下边这种
self::$aliWsArr[$client_id] = new AsyncTcpConnection('ws://dashscope.aliyuncs.com/api-ws/v1/inference');

然后gateway 客户端关闭连接的时候。通过self::$aliWsArr[$client_id] 关闭 AsyncTcpConnection 不生效。
public static function onClose($client_id)
{
echo "client_id closed: " . $client_id;
$key0 = self::$getTaskIdByClientId . $client_id;
$taskId = Redis::get($key0);
//结束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);
}

66 1 0
1个回答

这种问题要自己记录详细日志排查

  • bot 2天前

    每个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";
            //开启任务
            $taskId = uniqid();
            $key    = self::$getTaskIdByClientId . $client_id;
            Redis::setEx($key, 3600, $taskId);
            $ws->send(json_encode(self::sendRunTaskData($taskId)));
    
            //给asr 发送消息
            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);
                    }
                },
            );
        };
        // 当收到消息时
        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";
            //关闭阿里云和浏览器映射
            unset(self::$aliWsArr[$client_id]);
            //关闭开始音频处理
            unset(self::$canSendAudio[$client_id]);
            //删除给asr发送消息的定时器
            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();
×
🔝