大概是去年年初的时候了解到PHP还有Swoole的这一扩展。神奇的是这扩展好厉害;
可以让PHP不在局限于WEB开发;什么MQTT WEBSOCKET Proxy 什么的,总之很强大。
文档我今年才开始陆陆续续抽时间去看,就这个WEBSOCKET有点感到无助,但是又不会。
例如这一篇:
https://wiki.swoole.com/#/websocket_server?id=%e5%8f%91%e9%80%81ping%e5%b8%a7
标题
发送 Ping 帧
描述
由于 WebSocket 是长连接,如果一定时间内没有通讯,连接可能会断开。这时候需要心跳机制,WebSocket 协议包含了 Ping 和 Pong 两个帧,可以定时发送 Ping 帧来保持长连接。
代码:
服务端
use Swoole\WebSocket\Frame; | |
use Swoole\WebSocket\Server; | |
$server = new Server('127.0.0.1', 9501); | |
$server->on('message', function (Server $server, Frame $frame) { | |
$pingFrame = new Frame; | |
$pingFrame->opcode = WEBSOCKET_OPCODE_PING; | |
$server->push($frame->fd, $pingFrame); | |
}); | |
$server->start(); |
客户端
use Swoole\WebSocket\Frame; | |
use Swoole\Coroutine\Http\Client; | |
use function Swoole\Coroutine\run; | |
run(function () { | |
$cli = new Client('127.0.0.1', 9501); | |
$cli->upgrade('/'); | |
$pingFrame = new Frame; | |
$pingFrame->opcode = WEBSOCKET_OPCODE_PING; | |
// 发送 PING | |
$cli->push($pingFrame); | |
// 接收 PONG | |
$pongFrame = $cli->recv(); | |
var_dump($pongFrame->opcode === WEBSOCKET_OPCODE_PONG); | |
}); |
我寻思着,我可在JS客户端Interval函数去定时发送特定消息(Ping)来阻止服务器因客户端长时间未回应而切断连接。
问题是我看到官方提供的源码里是返回一个叫$pingFrame的对象,我把这个对象dump出来后,我寻思着我要不要也以这种数据格式写在前端并且返回服务器。