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
复制代码

资料

相关文章
相关标签/搜索