yii2-websocket 是基於 yii2 實現的 WebSocket 擴充套件,提供 WebSocket 客戶端及 WebSocket 服務端。
底層支援 swoole
及 workerman
驅動。
workerman的 fd 連線號存在問題,目前推薦使用
swoole
驅動。
為什麼需要 WebSocket ?
WebSocket 是一種網路通訊協議。RFC6455
定義了它的通訊標準。
瞭解計算機網路協議的人,應該都知道:HTTP 協議是一種無狀態的、無連線的、單向的應用層協議。它採用了 請求/響應 模型。通訊請求只能由客戶端發起,服務端對請求做出應答處理。
這種通訊模型有一個弊端:HTTP 協議無法實現伺服器主動向客戶端發起訊息。
這種單向請求的特點,註定瞭如果伺服器有連續的狀態變化,客戶端要獲知就非常麻煩。大多數 Web 應用程式將通過頻繁的非同步JavaScript
和XML(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
複製程式碼
資料
- yii2-websocket 使用文件 (有關驅動程式特定控制檯命令及其選項的更多詳細資訊,請參閱此文件)
- [WebSocket 詳細教程](www.cnblogs.com/jingmoxukon…