有时候会有些极端的情况,例如客户端掉电、网络关闭、网线掉了、路由故障等。会导致服务端无法触发onClose回调。另外路由节点防火墙会关闭长时间不通讯的socket连接,导致socket长连接断开。

这两种情况都需要使用心跳来解决。所谓心跳,其实就是服务端和客户端定时通信一下就好了。

两种情况

文档中还有个说明,说分两种情况。

首先都是服务端定时向客户端发心跳数据。

如果,客户端不响应数据,那碰到极端情况,可能需要10分钟以上才能触发onClose。 另一种是,客户端做响应,如果服务端在指定时间没有收到任何响应的信息,那就直接触发onClose

GatewayWorker

GatewayWorker中实现心跳,也是很简单啊。打开Applications/YourApp/start_gateway.php,取消这两行代码的屏蔽。这样GatewayWorker就会每10秒钟,发送一条{"type":"ping"}的数据过去。

// 心跳间隔
$gateway->pingInterval = 10;
// 心跳数据
$gateway->pingData = '{"type":"ping"}';

这里的10秒,可以根据自己需求修改,但一般不要超过60秒,也就是一分钟。

vue

为了能立即触发onCloser,而不是等上10分钟。实现也很简单,在vue部分加上

case 'ping':
    ws.send('pong');
    break;

这里的pong其实并没有任何意思,它就是为了模拟下心跳的砰砰砰的声音而已,其实你愿意发送什么过去都行的。。。

GatewayWorker那边只要收到消息了,它就知道我们还没有断开。network打开一看,可以看到每10秒钟,它们之间就有一次通信了。