| 維度 | AJAX 輪詢 | WebSocket |
| 連接模式 | 短連接,頻繁建立/銷毀 | 持久長連接,單次握手 |
| 資料流向 | Client 被動請求 | Server 主動推送 |
| 延遲 | 受輪詢間隔限制(通常 1-5 秒) | 毫秒級即時 |
| 伺服器負載 | 高(大量無效請求) | 低(僅有資料變動時通訊) |
| 實作複雜度 | 低 | 中(需處理重連、心跳、狀態同步) |
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();
生產環境關鍵補強
- 心跳機制:Client 定時發送
ping,Server 回 pong,偵測斷連。Swoole 可配置 heartbeat_idle_time、heartbeat_check_interval 自動斷開閒置連線。
- 身份驗證:握手階段驗證 Token(
$request->header['sec-websocket-protocol'] 或 Query String),拒絕未授權連線。
- 訊息協定:定義 JSON 結構
{type, payload, seq},支援請求-回應模式(seq 配對)。
- 平滑重啟:Swoole 支援
Manager 進程管理 Worker,發送 SIGUSR1 觸發熱重載,不中斷長連接。
- 叢集擴展:多台 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 指令下發等場景。關鍵在於連線生命週期管理(驗證、心跳、重連、狀態同步)與訊息協定設計,建議從簡單單機版迭代至叢集架構。
- 上一篇文章: PHP addcslashes 與 stripcslashes:自訂字元轉義與還原實戰
- 下一篇文章: PHP addslashes 與 stripslashes:標準字串轉義與還原完整指南
Copyright ©
程式碼之家 All Rights Reserved