yii2-websocket 是基於 yii2 實現的 WebSocket 擴展,提供 WebSocket 客戶端及 WebSocket 服務端。php
底層支持 swoole
及 workerman
驅動。git
workerman的 fd 鏈接號存在問題,目前推薦使用
swoole
驅動。github
WebSocket 是一種網絡通訊協議。RFC6455
定義了它的通訊標準。web
瞭解計算機網絡協議的人,應該都知道:HTTP 協議是一種無狀態的、無鏈接的、單向的應用層協議。它採用了 請求/響應 模型。通訊請求只能由客戶端發起,服務端對請求作出應答處理。json
這種通訊模型有一個弊端:HTTP 協議沒法實現服務器主動向客戶端發起消息。bootstrap
這種單向請求的特色,註定了若是服務器有連續的狀態變化,客戶端要獲知就很是麻煩。大多數 Web 應用程序將經過頻繁的異步JavaScript
和XML(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 的功能都須要定義一個單獨的類,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
方法,用於清理客戶端在服務器上與業務的綁定關係。
Yii::$app->websocket->send(['channel' => 'push-message', 'message' => '用戶 xxx 送了一臺飛機!']);
複製代碼
執行任務的確切方式取決於使用的驅動程序。 大多數驅動程序可使用控制檯命令運行,組件須要在應用程序中註冊。
此命令啓動一個守護進程,該守護進程維護一個 WebSocket Server,根據客戶端發來的數據,處理相關 channel 的任務:
yii websocket/start
複製代碼