為啥我使用webman自定義進(jìn)程連接別人的websocket的時(shí)候時(shí)間長(zhǎng)了進(jìn)程會(huì)收不到消息了。
這是執(zhí)行php status.php status的狀態(tài) total_request數(shù)量一直不增加了。也收不到對(duì)方推送的消息了。
代碼里也沒(méi)有報(bào)錯(cuò)。查看stdout.log和webman.log也沒(méi)有報(bào)錯(cuò)信息。
連接的時(shí)候使用AsyncTcpConnection 類 使用匿名函數(shù)的方式定義了onConnect,onClose,onError的回調(diào)其中 下列是連接代碼。
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鏈接斷開(kāi),執(zhí)行重連" . date("Y-m-d H:i:s"));
};
$futuresCon->onError = function ($futuresCon, $code, $msg) {
echo "期貨錯(cuò)誤信息 $code $msg\n";
};
$futuresCon->connect();
}
websocket連接就一直收不到信息了。然后進(jìn)程也在,也沒(méi)有執(zhí)行onClose的回調(diào)。
http://www.wtbis.cn/doc/workerman/faq/heartbeat.html
看你代碼跟描述,像是這個(gè)問(wèn)題.
呃 服務(wù)端的websocket里會(huì)發(fā)ping檢測(cè)的,workerman會(huì)自動(dòng)響應(yīng)pong幀。不是心跳的問(wèn)題
workerman端也要加心跳,或者至少判斷下多少秒內(nèi)沒(méi)收到對(duì)方心跳就斷開(kāi)重連。否則你和對(duì)方的網(wǎng)絡(luò)中斷了,你都不知道,自然不會(huì)重連了