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

2025 年 4 月 24 日
 awanganddong
    /**
     * 项目 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 不存在数据。

3603 次点击
所在节点    PHP
7 条回复
awanganddong
2025 年 4 月 24 日
我是一套客户端和服务端的长连接,一套服务端与阿里云的长连接(启动在 onConnect 中启动)

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

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

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

public static $sendAliyunChan;

public static $sendWsChan;

protected static $aliWs = null;
}
在这里定义
awanganddong
2025 年 4 月 24 日
self::$aliWsArr[$client_id] = $ws;
我应该这样存数据
kivmi
2025 年 4 月 27 日
链接 reconnect 能成功吗?超时就断开了,虽然你这边还持有这个链接对象,但是已经失活了吧!
awanganddong
2025 年 4 月 28 日
现在 reconnect 没有使用,超时断了就断了。
失活这种情况。我测试 下。现在给阿里 ars 发关闭消息,确实不生效。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1127661

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX