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

PHP + Swoole 實現 WebSocket 服務端推送實時數據更新(一)

     編輯:PHP 相關知識

背景:從輪詢到 WebSocket

傳統 Ajax 輪詢實現實時更新簡單但浪費資源:客戶端定時請求,大部分請求無新數據。HTML5 WebSocket 提供全雙工長連接,服務端可主動推送數據,極大降低延遲與服務器負載。

客戶端實現(瀏覽器 JavaScript)

var ws = null;
function connectWebSocket() {
    if (ws === null) {
        var wsServer = 'ws://' + location.hostname + ':8888';
        ws = new WebSocket(wsServer);
        ws.onopen = function() { console.log("WebSocket 連接已建立"); };
        ws.onmessage = function(e) { 
            console.log("收到推送:", e.data);
            // 解析 e.data 更新 UI,如列表刷新、通知彈窗等
        };
        ws.onclose = function() { console.log("連接已斷開"); setTimeout(connectWebSocket, 5000); }; // 自動重連
        ws.onerror = function(e) { console.error("錯誤:", e); };
        window.addEventListener('beforeunload', function() { ws.close(); });
    }
}
connectWebSocket();

服務端實現(PHP + Swoole)

Swoole 是 PHP 高性能網絡通信擴展,內建 WebSocket 服務器支持。

1. 安裝 Swoole

pecl install swoole
# 或編譯安裝,詳見官網文檔

2. 基礎 WebSocket 服務器代碼

<?php
$server = new swoole_websocket_server("0.0.0.0", 8888);

// 連接建立
$server->on('open', function (swoole_websocket_server $server, $request) {
    echo "新連接: fd={$request->fd}\n";
    // 可在此綁定用戶ID與fd映射:$server->uid = $request->fd;
});

// 接收消息
$server->on('message', function (swoole_websocket_server $server, $frame) {
    echo "收到來自 {$frame->fd}: {$frame->data}\n";
    // 業務邏輯處理,如廣播、單發
    $server->push($frame->fd, "Server 收到: {$frame->data}");
});

// 連接關閉
$server->on('close', function ($ser, $fd) {
    echo "客戶端 {$fd} 斷開\n";
    // 清理映射關係
});

$server->start();

3. 運行服務器

php server.php

服務器將在 8888 端口監聽 WebSocket 連接。

關鍵點解析

  • fd (文件描述符):Swoole 為每個連接分配唯一整數 ID,用於標識客戶端,push 發送數據需指定 fd。
  • 異步非阻塞:Swoole 底層基于 epoll/kqueue,單進程可維護萬級並發連接。
  • 進程模型:Master 進程管理 Worker/Task 進程,WebSocket 事件回調在 Worker 進程中執行。

下一步預告

本文建立了最基礎的推送通道。下一篇將深入:

  1. 用戶身份認證與 fd 綁定(實現精準單發/組播)。
  2. 結合 Redis 發布訂閱實現多進程/多服務器消息廣播。
  3. 心跳檢測與斷線重連機制完善。
  4. 數據協議設計(JSON/Protobuf)與前端解析規範。

總結

使用 Swoole 開發 WebSocket 服務端極其簡潔高效,幾十行代碼即可構建高性能實時推送服務,是 PHP 邁向高併發實時應用的利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved