天天看點

PHP 基于 SW-X 架構,搭建WebSocket伺服器(一)

前言

官網位址:​​SW-X架構-專注高性能便捷開發而生的PHP-SwooleX架構​​

希望各大佬舉起小手,給小弟一個star:​​https://github.com/swoolex/swoolex​​

1、服務說明

在SW-X中,啟動websocket服務時,會同時支援HTTP和WebSocket兩種請求。

部署好SW-X源碼後,修改​

​/config/server.php​

​配置檔案中的​

​host​

​和​

​port​

​,​

​0.0.0.0​

​表示不限制内外網IP,​

​port​

​預設為​

​9502​

​端口。

完成後,使用​

​php sw-x start websocket​

​指令啟動websocket服務即可。

若你使用雲伺服器,記得在服務商的控制台->安全組中開放對應的端口号;若你還裝的是寶塔環境,還需要在寶塔面闆的安全組中再開放一次端口才行,否則外網是無法通路的。

2、事件支援

衆所周知,websocket的日常開發,至少都需要用到​

​onOpen​

​和​

​onClose​

​兩種消息事件。

在SW-X中,會對Swoole的事件進行轉發定義,統一存放在​

​/box/event/server/​

​目錄下,檔案名稱為對應消息的事件名。

正常情況WebSocket開發,隻需要改動到以下​

​3​

​種事件:

// 連接配接握手時 [這裡實作業務鑒權]
onOpen.php
// 接收到用戶端消息時 [多數情況下這裡都不需要重寫]
onMessage.php
// 關閉連接配接時 [這裡實作下線銷毀]
onClose.php      

3、WSS配置

SW-X的WebSocket服務要開啟WSS很簡單,隻需要修改​

​/config/server.php​

​配置項中的,​

​ssl_cert_file​

​、​

​ssl_key_file​

​證書路徑即可。

4、接受用戶端消息

當​

​/config/server.php​

​配置檔案中的​

​is_onMessage​

​設定為​

​true​

​時【預設值】,則表示啟用架構對​

​onMessage​

​事件進行監聽處理,也代表啟用架構對WebSocket的控制器處理。

也不建議改為​

​false​

​,除非你對Swoole很熟悉,同時也很熟悉WebSocket服務的開發工作。

SW-X對WebSocket服務的資料處理,僅支援固定格式的​

​JSON​

​資料包,同時支援配置啟用對資料進行​

​AES​

​加解密,隻需要修改​

​/config/server.php​

​中的配置項即可開啟。

用戶端資料包,未加密前的格式應該為:

{
    "action":"請求路由",
    "data":請求資料
}      

若是将​

​is_onMessage​

​設定為​

​false​

​時,架構則不再監聽​

​onMessage​

​事件,改由開發者自己監聽​

​/box/event/server/​

​下的​

​onMessage​

​事件,進而實作資料分包。

5、服務端推出消息

WebSocket控制器中輸出傳回值跟HTTP控制器一樣,都是調用​

​fetch()​

​方法,隻不過傳入的參數格式不一樣。

該方法按以下順序,共支援4個參數傳遞:

$action  狀态碼
$msg  說明,預設值:success,非必填
$data 結果集,預設值:[],非必填
$fd 用戶端的連接配接辨別符[Swoole的fd],預設值:目前用戶端連接配接,非必填      

若需要群發消息時,需要循環調用該方法,傳入用戶端對應的​

​$fd​

​值即可。

​fetch()​

​最終推送出去的資料結構如下(未開啟加密前):

{
    "action":"狀态值",
    "msg":"描述",
    "data":"傳回值",
}      
建議用HTTP-API接口的互動方式,來解讀SW-X對WebSocket服務的設計會比較好了解一些。

6、WebSocket控制器

WebSocekt的控制器會根據​

​action​

​字段進行路由比對,最終找到​

​/app/websocket/​

​目錄下的控制器檔案進行處理。

該目錄下的事件控制器,都需要繼承​

​\x\controller\WebSocekt​

​基類。

WebSocekt的路由處理,與HTTP服務的一樣,如果你熟悉SW-X的路由模式,上手将會非常簡單。

例如,定義一個​

​user/login​

​的路由,隻需要建立​

​/app/websocket/user/login.php​

​檔案,并寫入以下代碼即可:

namespace app\websocket\user;
use x\controller\WebSocket;

class login extends WebSocket{
    // index是預設忽略的方法
    public function index() {
        return $this->fetch(200, '描述', []);
    }
}      

7、接受用戶端傳遞的data内容

由于WebSocket服務是使用JSON格式進行資料互動,同時支援AES資料加解密,是以日常開發中,隻能通過控制器提供的方法來獲得用戶端請求的表單内容,​

​$this->param()​

​方法用于獲得解密後的​

​data​

​内容,傳回值是一個多元數組。

例如,将上面的​

​user/login​

​路由檔案,改成以下代碼:

namespace app\websocket\user;
use x\controller\WebSocket;

class login extends WebSocket{
    // index是預設忽略的方法
    public function index() {
        // 接收請求參數
        $param = $this->param();
        // 推回給前端做顯示
        return $this->fetch(200, '别亂發東西', $param);
    }
}      

8、簡單調試

SW-X官網提供了WebSocket的線上測試工具,具體位址:http://websocket.sw-x.cn/debug/websocket.html

如果你是wss,使用:https://www.sw-x.cn/debug/websocket.html

使用該工具,我們可以對上面的​

​user/login​

​路由進行線上測試。

{
  "action": "user/login",
  "data": {
    "id": "123",
    "username": "SW-X真簡單!"
  }
}      

繼續閱讀