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

基於 Swoole 實現 PHP WebSocket 服務端完整示例

     編輯:PHP 相關知識

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));

關鍵組件解析

1. 協議處理類繼承

通過繼承 SwooleNetworkProtocolWebSocket,只需重寫 onMessage、onClose 等鉤子方法即可實現業務邏輯,框架自動處理握手、幀解析等底層細節。

2. 連接生命周期管理

  • onMessage:核心業務入口,接收參數 $client_id(連接標識)和 $ws['message'](解碼後的數據)
  • onClose:清理資源、通知其他用戶、記錄離線日誌的最佳時機
  • broadcast:遍歷 $this->connections 實現廣播,實際項目中建議維護 uid => fd 映射表實現精準推送

3. 服務器配置與啟動

  • worker_num => 4:設置 4 個 Worker 進程,充分利用多核 CPU
  • daemonize():生產環境必須開啟守護進程模式,脫離終端運行
  • 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 開發者邁向高性能網絡編程的關鍵一步。本示例代碼結構清晰,可直接作為項目骨架擴展。

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