yii2-websocket | 基於 yii2 實現的 WebSocket 擴充套件

GUNN發表於2019-01-07

yii2-websocket 是基於 yii2 實現的 WebSocket 擴充套件,提供 WebSocket 客戶端及 WebSocket 服務端。

底層支援 swooleworkerman 驅動。

workerman的 fd 連線號存在問題,目前推薦使用 swoole 驅動。

為什麼需要 WebSocket ?

WebSocket 是一種網路通訊協議。RFC6455 定義了它的通訊標準。

瞭解計算機網路協議的人,應該都知道:HTTP 協議是一種無狀態的、無連線的、單向的應用層協議。它採用了 請求/響應 模型。通訊請求只能由客戶端發起,服務端對請求做出應答處理。

這種通訊模型有一個弊端:HTTP 協議無法實現伺服器主動向客戶端發起訊息。

這種單向請求的特點,註定瞭如果伺服器有連續的狀態變化,客戶端要獲知就非常麻煩。大多數 Web 應用程式將通過頻繁的非同步JavaScriptXML(AJAX)請求實現長輪詢。輪詢的效率低,非常浪費資源(因為必須不停連線,或者 HTTP 連線始終開啟)。

因此,工程師們一直在思考,有沒有更好的方法。WebSocket 就是這樣發明的。WebSocket 連線允許客戶端和伺服器之間進行全雙工通訊,以便任一方都可以通過建立的連線將資料推送到另一端。WebSocket 只需要建立一次連線,就可以一直保持連線狀態。這相比於輪詢方式的不停建立連線顯然效率要大大提高。

yii2-websocket 擴充套件通過底層 swoole/workerman 驅動實現 WebSocket 服務,並提供了客戶端及服務端。

安裝

安裝此擴充套件程式的首選方法是通過 composer.

編輯執行

php composer.phar require --prefer-dist yiiplus/yii2-websocket "^1.0.0"
複製程式碼

或新增配置到專案目錄下的composer.json檔案的 require 部分

"yiiplus/yii2-websocket": "^1.0.0"
複製程式碼

基本使用

配置

return [
    'bootstrap' => [
        'websocket',
    ],
    'compoents' => [
        'websocket' => [
            'class' => '\yiiplus\websocket\<dirver>\WebSocket',
            'host' => '127.0.0.1',
            'port' => 9501,
            'channels' => [
                'push-message' => '\xxx\channels\PushMessageChannel', // 配置 channel 對應的執行類
            ],
      ],
    ],
];
複製程式碼

定義 channel 執行類

每個 channel 的功能都需要定義一個單獨的類,WebSocket Server 會通過客戶端傳來的 channel 引數解析。

例如,如果你需要為所有客戶端推送一條訊息,則該類可能如下所示:

namespace xxx\channels;

class PushMessageChannel extends BaseObject implements \yiiplus\websocket\ChannelInterface
{
    public function execute($fd, $data)
    {
        return [
            $fd, // 第一個引數返回客戶端ID,多個以陣列形式返回
            $data->message // 第二個引數返回需要返回給客戶端的訊息
        ];
    }

    public function close($fd)
    {
        return;
    }
}
複製程式碼

定義好的執行類需要註冊到 compoents 配置中的 channel 下。

當客戶端斷開連線時會觸發所有 channels 下的 close 方法,用於清理客戶端在伺服器上與業務的繫結關係。

客戶端傳送 channel 訊息,觸發執行類

Yii::$app->websocket->send(['channel' => 'push-message', 'message' => '使用者 xxx 送了一臺飛機!']);
複製程式碼

控制檯執行

執行任務的確切方式取決於使用的驅動程式。 大多數驅動程式可以使用控制檯命令執行,元件需要在應用程式中註冊。

此命令啟動一個守護程式,該守護程式維護一個 WebSocket Server,根據客戶端發來的資料,處理相關 channel 的任務:

yii websocket/start
複製程式碼

資料

相關文章