/**
* 项目 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 5 天前
我猜测的可能:
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 1 天前
链接 reconnect 能成功吗?超时就断开了,虽然你这边还持有这个链接对象,但是已经失活了吧!
|
7
awanganddong OP 现在 reconnect 没有使用,超时断了就断了。
失活这种情况。我测试 下。现在给阿里 ars 发关闭消息,确实不生效。 |