V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
awanganddong
V2EX  ›  PHP

workman 与阿里云实时语音通信的问题。

  •  
  •   awanganddong · 5 天前 · 907 次点击
        /**
         * 项目 socket 连接时触发(一次)
         * 当客户端与 Workerman 建立连接时(TCP 三次握手完成后)触发的回调函数
         */
        public static function onConnect($client_id)
        {
    
            // 定义连接函数
            $connectWs = function () {
    
                $ws            = new AsyncTcpConnection('ws://dashscope.aliyuncs.com/api-ws/v1/inference');
                $ws->headers   = [
                    "Authorization" => "Bearer " . getenv("DASHSCOPE_API_KEY"),
                ];
                $ws->transport = "ssl";
    
                // 连接成功回调
                $ws->onConnect = function ($ws) {
                    self::$aliWs = $ws;
                    echo "connected success:" . $ws->id . "\n";
                };
    
                // 当收到消息时
                $ws->onMessage = function ($ws, $data) {
                    var_dump("ali 返回消息", $data);
                    $msg     = json_decode($data, true);
                    $channel = self::$sendWsChan;
                    Coroutine::create(
                        function () use ($channel, $msg) {
                            $channel->push($msg);
                        },
                    );
                };
    
                // 连接关闭时进行重连
                $ws->onClose = function ($ws) {
                    echo "连接关闭,尝试重新连接...\n";
                    self::$aliWs = null;
                    $ws->reConnect(1);
                };
                $ws->onError = function ($ws) {
                    echo "错误输出" . $ws->error;
                };
                $ws->connect();
            };
            
            		//定时器触发
                      if (self::$aliWs) {
                                    var_dump("发送事件");
                                    self::$aliWs->send(json_encode($data));
                                }
    

    初次建立长连接可以发送成功,但是如果阿里云长连接断线重连几次后,发送事件,在 onMessage 里边没有响应。不明白为什么出现这种情况。var_dump("发送事件"); 可以打印数据。但是 onMessage 不存在数据。

    7 条回复    2025-04-28 09:51:37 +08:00
    awanganddong
        1
    awanganddong  
    OP
       5 天前
    我是一套客户端和服务端的长连接,一套服务端与阿里云的长连接(启动在 onConnect 中启动)

    断线重连后,通过 channel 给阿里云 aws 发送消息,但是没响应。不知道为什么出现这种问题。
    lyxxxh2
        2
    lyxxxh2  
       5 天前
    我猜测的可能:
    1. self::aliWs->send 没发送成功
    - 打印只能证明调用了

    2. self::$aliWs 跟 $ws 不是同个实例。
    - 看你代码,肯定是同个实例。 但是你实际代码肯定不这样。
    awanganddong
        3
    awanganddong  
    OP
       5 天前
    发代码被屏蔽了
    awanganddong
        4
    awanganddong  
    OP
       5 天前
    我是没外界用户没建立一个长连接,就起一个阿里的 ws 服务。
    class Events
    {

    public static $sendTaskKey = "send-task_relation::";

    public static $sendAliyunChan;

    public static $sendWsChan;

    protected static $aliWs = null;
    }
    在这里定义
    awanganddong
        5
    awanganddong  
    OP
       5 天前
    self::$aliWsArr[$client_id] = $ws;
    我应该这样存数据
    kivmi
        6
    kivmi  
       1 天前
    链接 reconnect 能成功吗?超时就断开了,虽然你这边还持有这个链接对象,但是已经失活了吧!
    awanganddong
        7
    awanganddong  
    OP
       1 天前
    现在 reconnect 没有使用,超时断了就断了。
    失活这种情况。我测试 下。现在给阿里 ars 发关闭消息,确实不生效。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5191 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 07:57 · PVG 15:57 · LAX 00:57 · JFK 03:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.