关于我在学习Swoole的痛点

PHP技术
407
0
0
2022-04-10
标签   Swoole

大概是去年年初的时候了解到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出来后,我寻思着我要不要也以这种数据格式写在前端并且返回服务器。