yii2-websocket | 基於 yii2 實現的 WebSocket 擴展

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

底層支持 swooleworkerman 驅動。git

workerman的 fd 鏈接號存在問題,目前推薦使用 swoole 驅動。github

爲何須要 WebSocket ?

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

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

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

這種單向請求的特色,註定了若是服務器有連續的狀態變化,客戶端要獲知就很是麻煩。大多數 Web 應用程序將經過頻繁的異步JavaScriptXML(AJAX)請求實現長輪詢。輪詢的效率低,很是浪費資源(由於必須不停鏈接,或者 HTTP 鏈接始終打開)。數組

所以,工程師們一直在思考,有沒有更好的方法。WebSocket 就是這樣發明的。WebSocket 鏈接容許客戶端和服務器之間進行全雙工通訊,以便任一方均可以經過創建的鏈接將數據推送到另外一端。WebSocket 只須要創建一次鏈接,就能夠一直保持鏈接狀態。這相比於輪詢方式的不停創建鏈接顯然效率要大大提升。bash

yii2-websocket 擴展經過底層 swoole/workerman 驅動實現 WebSocket 服務,並提供了客戶端及服務端。服務器

安裝

安裝此擴展程序的首選方法是經過 composer.websocket

編輯運行

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
複製代碼

資料

相關文章
相關標籤/搜索