首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP Swoole 實現 WebSocket 即時資料推送:從輪詢到長連接的架構升級

     編輯:PHP 綜合知識

傳統輪詢 vs WebSocket

Client 端:原生 WebSocket API

let ws = null;
function connect() {
    if (ws) return;
    const wsServer = `ws://${location.hostname}:8888`;
    ws = new WebSocket(wsServer);

    ws.onopen = () => console.log('連線已建立');
    ws.onmessage = (e) => {
        console.log('收到訊息:', e.data);
        // 解析 JSON、更新 UI、觸發事件等
        const data = JSON.parse(e.data);
        handleUpdate(data);
    };
    ws.onclose = () => {
        console.log('連線關閉,3 秒後重連...');
        ws = null;
        setTimeout(connect, 3000);
    };
    ws.onerror = (e) => console.error('錯誤:', e);
}

// 頁面卸載前關閉
window.addEventListener('beforeunload', () => ws?.close());

connect();

Server 端:Swoole WebSocket Server

Swoole 是 PHP 非同步網路通訊擴充套件,內建 HTTP/WebSocket Server,效能極高。

on('open', function($server, $request) {
    echo "Client {$request->fd} 連線\n";
    // 可在此綁定用戶 ID、加入房間等
    $server->push($request->fd, json_encode(['type'=>'welcome', 'fd'=>$request->fd]));
});

// 接收訊息
$server->on('message', function($server, $frame) {
    echo "收自 {$frame->fd}: {$frame->data}\n";
    $data = json_decode($frame->data, true);
    // 業務邏輯:廣播、單發、資料庫操作等
    if ($data['action'] === 'broadcast') {
        foreach ($server->connections as $fd) {
            $server->push($fd, json_encode(['type'=>'broadcast', 'msg'=>$data['msg']]));
        }
    }
});

// 連線關閉
$server->on('close', function($server, $fd) {
    echo "Client $fd 斷線\n";
    // 清理用戶狀態、離開房間等
});

$server->start();

生產環境關鍵補強

  1. 心跳機制:Client 定時發送 ping,Server 回 pong,偵測斷連。Swoole 可配置 heartbeat_idle_time、heartbeat_check_interval 自動斷開閒置連線。
  2. 身份驗證:握手階段驗證 Token($request->header['sec-websocket-protocol'] 或 Query String),拒絕未授權連線。
  3. 訊息協定:定義 JSON 結構 {type, payload, seq},支援請求-回應模式(seq 配對)。
  4. 平滑重啟:Swoole 支援 Manager 進程管理 Worker,發送 SIGUSR1 觸發熱重載,不中斷長連接。
  5. 叢集擴展:多台 Swoole Server 需共享連線狀態,引入 Redis Pub/Sub 或 Swoole 內建 Swoole\Server::sendMessage 跨進程通訊。

完整專案結構建議

project/
├── server.php          # Swoole 入口
├── config/
│   └── server.php      # 監聽埠、心跳、進程數等
├── src/
│   ├── Handler/        # 訊息處理器 (登入、聊天、通知...)
│   ├── Protocol/       # 協定編解碼
│   └── Service/        # 業務服務 (Redis、DB、推送)
├── bootstrap.php       # 容器、配置載入
└── start.sh            # 啟動/重啟腳本

效能基準參考

  • 單機 4 核心、8GB RAM,Swoole 4.x + PHP 8.1,可支援 5 萬+ 並發連線,訊息延遲 < 5ms。
  • 記憶體佔用:每連線約 2-5 KB(視緩衝區設定)。
  • CPU 瓶頸通常在 JSON 編解碼與業務邏輯,建議使用 igbinary、msgpack 序列化替代 JSON。

總結

Swoole 讓 PHP 具備高效能長連接伺服器能力,配合 WebSocket 協定,可輕鬆實現即時聊天、協同編輯、股票行情推送、IoT 指令下發等場景。關鍵在於連線生命週期管理(驗證、心跳、重連、狀態同步)與訊息協定設計,建議從簡單單機版迭代至叢集架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度AJAX 輪詢WebSocket
連接模式短連接,頻繁建立/銷毀持久長連接,單次握手
資料流向Client 被動請求Server 主動推送
延遲受輪詢間隔限制(通常 1-5 秒)毫秒級即時
伺服器負載高(大量無效請求)低(僅有資料變動時通訊)
實作複雜度低中(需處理重連、心跳、狀態同步)