WebSocket 協議實現了瀏覽器與服務器的雙向實時通信,極大拓展了 Web 應用類型。在 PHP 生態中,Swoole 擴展以其高性能異步非阻塞特性,成為構建 WebSocket 服務的首選方案。本文提供一個基於 swoole_framework 的完整服務端實現。
<?php
define('DEBUG', 'on');
define("WEBPATH", str_replace("\\", "/", __DIR__));
require __DIR__ . '/../libs/lib_config.php';
class WebSocket extends SwooleNetworkProtocolWebSocket {
/**
* 客戶端斷開連接時觸發
*/
function onClose($serv, $client_id, $from_id) {
// 可選:廣播下線通知
// $this->broadcast($client_id, "onOffline: " . $client_id);
parent::onClose($serv, $client_id, $from_id);
}
/**
* 接收到客戶端消息時觸發
*/
function onMessage($client_id, $ws) {
$this->log("onMessage: " . $client_id . ' = ' . $ws['message']);
// 回覆確認消息
$this->send($client_id, "Server: " . $ws['message']);
// 可選:廣播給所有其他客戶端
// $this->broadcast($client_id, $ws['message']);
}
/**
* 廣播消息給除發送者外的所有連接
*/
function broadcast($client_id, $msg) {
foreach ($this->connections as $clid => $info) {
if ($client_id != $clid) {
$this->send($clid, $msg);
}
}
}
}
// 啟動服務
$AppSvr = new WebSocket();
$AppSvr->loadSetting(__DIR__ . "/swoole.ini"); // 加載配置
$AppSvr->setLogger(new SwooleLogEchoLog(true)); // 設置日誌
$server = new SwooleNetworkServer('0.0.0.0', 9503);
$server->setProtocol($AppSvr);
// $server->daemonize(); // 生產環境建議開啟守護進程模式
$server->run(array('worker_num' => 4));
通過繼承 SwooleNetworkProtocolWebSocket,只需重寫 onMessage、onClose 等鉤子方法即可實現業務邏輯,框架自動處理握手、幀解析等底層細節。
$client_id(連接標識)和 $ws['message'](解碼後的數據)$this->connections 實現廣播,實際項目中建議維護 uid => fd 映射表實現精準推送worker_num => 4:設置 4 個 Worker 進程,充分利用多核 CPUdaemonize():生產環境必須開啟守護進程模式,脫離終端運行swoole.ini:建議將端口、進程數、心跳間隔等參數外部化配置在 swoole.ini 中配置:
heartbeat_check_interval = 30
heartbeat_idle_time = 60
自動清理僵死連接,防止文件描述符洩漏。
建議定義統一 JSON 協議:
{
"cmd": "chat|broadcast|private",
"data": { ... },
"timestamp": 1699900000
}
在 onMessage 中統一解析、路由分發,提升可維護性。
發送 SIGUSR1 信號觸發 Worker 進程逐個重啟,配合 onWorkerStart 完成熱更新,實現零停機部署。
<script>
const ws = new WebSocket('ws://your-server-ip:9503');
ws.onopen = () => ws.send(JSON.stringify({cmd: 'chat', data: 'Hello Swoole!'}));
ws.onmessage = (e) => console.log('收到:', e.data);
</script>
Swoole 將 PHP 從傳統的「請求-響應」模式解放出來,賦予其長連接、實時推送能力。掌握 WebSocket 服務端開發,是 PHP 開發者邁向高性能網絡編程的關鍵一步。本示例代碼結構清晰,可直接作為項目骨架擴展。