關於我在學習Swoole的痛點

michonnehsu發表於2021-04-23

大概是去年年初的時候瞭解到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出來後,我尋思著我要不要也以這種資料格式寫在前端並且返回伺服器。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
michi

相關文章