大概是去年年初的時候瞭解到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 協議》,轉載必須註明作者和本文連結