傳統 Ajax 輪詢實現實時更新簡單但浪費資源:客戶端定時請求,大部分請求無新數據。HTML5 WebSocket 提供全雙工長連接,服務端可主動推送數據,極大降低延遲與服務器負載。
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();
Swoole 是 PHP 高性能網絡通信擴展,內建 WebSocket 服務器支持。
pecl install swoole # 或編譯安裝,詳見官網文檔
<?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();
php server.php
服務器將在 8888 端口監聽 WebSocket 連接。
push 發送數據需指定 fd。本文建立了最基礎的推送通道。下一篇將深入:
使用 Swoole 開發 WebSocket 服務端極其簡潔高效,幾十行代碼即可構建高性能實時推送服務,是 PHP 邁向高併發實時應用的利器。