
/** * 项目 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 不存在数据。
1 awanganddong OP 我是一套客户端和服务端的长连接,一套服务端与阿里云的长连接(启动在 onConnect 中启动) 断线重连后,通过 channel 给阿里云 aws 发送消息,但是没响应。不知道为什么出现这种问题。 |
2 lyxxxh2 235 天前 我猜测的可能: 1. self::aliWs->send 没发送成功 - 打印只能证明调用了 2. self::$aliWs 跟 $ws 不是同个实例。 - 看你代码,肯定是同个实例。 但是你实际代码肯定不这样。 |
3 awanganddong OP 发代码被屏蔽了 |
4 awanganddong OP 我是没外界用户没建立一个长连接,就起一个阿里的 ws 服务。 class Events { public static $sendTaskKey = "send-task_relation::"; public static $sendAliyunChan; public static $sendWsChan; protected static $aliWs = null; } 在这里定义 |
5 awanganddong OP self::$aliWsArr[$client_id] = $ws; 我应该这样存数据 |
6 kivmi 231 天前 链接 reconnect 能成功吗?超时就断开了,虽然你这边还持有这个链接对象,但是已经失活了吧! |
7 awanganddong OP 现在 reconnect 没有使用,超时断了就断了。 失活这种情况。我测试 下。现在给阿里 ars 发关闭消息,确实不生效。 |