为啥我使用webman自定义进程连接别人的websocket的时候时间长了进程会收不到消息了。
这是执行php status.php status的状态 total_request数量一直不增加了。也收不到对方推送的消息了。
代码里也没有报错。查看stdout.log和webman.log也没有报错信息。
连接的时候使用AsyncTcpConnection 类 使用匿名函数的方式定义了onConnect,onClose,onError的回调其中 下列是连接代码。
public function onWorkerStart($worker)
{
var_dump('链接websocket' . date("Y-m-d H:i:s"));
$websocketConnection = (string)config('futures_websocket');
//期货
$futuresCon = new AsyncTcpConnection($websocketConnection);
//期货websocket
$this->futuresWebsocket($futuresCon);
}
public function futuresWebsocket(AsyncTcpConnection $futuresCon)
{
$futuresCon->transport = 'ssl';
$futuresCon->onConnect = function (AsyncTcpConnection $futuresCon) {
var_dump('期货ws连接成功' . date("Y-m-d H:i:s"));
$param = ['id' => mt_rand(0, 100), 'method' => 'SUBSCRIBE', 'params' => Cache::getSubscribeParam()['futures']];
$futuresCon->send(json_encode($param));
};
$futuresCon->onMessage = function (AsyncTcpConnection $futuresCon, $data) {
$msgData = json_decode($data, true);
if (!empty($msgData['data']['e'])) {
Cache::setStreamData($msgData['data']['e'], $msgData['data']['s'],$data);
}
};
$futuresCon->onClose = function (AsyncTcpConnection $futuresCon) {
$futuresCon->reconnect();
var_dump("期货ws链接断开,执行重连" . date("Y-m-d H:i:s"));
};
$futuresCon->onError = function ($futuresCon, $code, $msg) {
echo "期货错误信息 $code $msg\n";
};
$futuresCon->connect();
}
websocket连接就一直收不到信息了。然后进程也在,也没有执行onClose的回调。
这时候只有重启整个框架才又ok了。想不明白是啥问题导致的。
https://www.workerman.net/doc/workerman/faq/heartbeat.html
看你代码跟描述,像是这个问题.
呃 服务端的websocket里会发ping检测的,workerman会自动响应pong帧。不是心跳的问题
workerman端也要加心跳,或者至少判断下多少秒内没收到对方心跳就断开重连。否则你和对方的网络中断了,你都不知道,自然不会重连了