资讯专栏INFORMATION COLUMN

Laravel5.1 事件广播(Event Broadcasting)

yiliang / 1891人阅读

摘要:本文会用简单的代码展示一个事件广播的过程。定义一个被广播的事件根据文档的说明,想让事件被广播,必须让类实现一个接口,并且实现一个方法。返回一个数组,包含了事件发送到的频道。触发事件打开另一个页面。

事件广播 简介

Laravel 5.1 之中新加入了事件广播的功能,作用是把服务器中触发的事件通过websocket服务通知客户端,也就是浏览器,客户端js根据接受到的事件,做出相应动作。本文会用简单的代码展示一个事件广播的过程。

依赖

redis

nodejs, socket.io

laravel 5.1

配置

config/broadcasting.php中,如下配置"default" => env("BROADCAST_DRIVER", "redis"),,使用redis作为php和js的通信方式。
config/database.php中配置redis的连接。

定义一个被广播的事件

根据Laravel文档的说明,想让事件被广播,必须让Event类实现一个IlluminateContractsBroadcastingShouldBroadcast接口,并且实现一个方法broadcastOnbroadcastOn返回一个数组,包含了事件发送到的channel(频道)。如下:

namespace AppEvents;

use AppEventsEvent;
use IlluminateQueueSerializesModels;
use IlluminateContractsBroadcastingShouldBroadcast;

class SomeEvent extends Event implements ShouldBroadcast
{
    use SerializesModels;

    public $user_id;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($user_id)
    {
        $this->user_id = $user_id;
    }

    /**
     * Get the channels the event should be broadcast on.
     *
     * @return array
     */
    public function broadcastOn()
    {
        return ["test-channel"];
    }
}
被广播的数据

默认情况下,Event中的所有public属性都会被序列化后广播。上面的例子中就是$user_id这个属性。你也可以使用broadcastWith这个方法,明确的指出要广播什么数据。例如:

public function broadcastWith()
{
    return ["user_id" => $this->user_id];
}
Redis和Websocket服务器

需要启动一个Redis,事件广播主要依赖的就是redis的sub/pub功能,具体可以看redis文档

需要启动一个websocket服务器来和client通信,建议使用socket.io,代码如下:

var app = require("http").createServer(handler);
var io = require("socket.io")(app);

var Redis = require("ioredis");
var redis = new Redis("6379", "192.168.1.106");

app.listen(6001, function() {
    console.log("Server is running!");
});

function handler(req, res) {
    res.writeHead(200);
    res.end("");
}

io.on("connection", function(socket) {
    console.log("connected");
});

redis.psubscribe("*", function(err, count) {
    console.log(count);
});

redis.on("pmessage", function(subscribed, channel, message) {
    console.log(subscribed);
    console.log(channel);
    console.log(message);

    message = JSON.parse(message);
    io.emit(channel + ":" + message.event, message.data);
});

这里需要注意的是redis.on方法的定义,接收到消息后,给client发送一个事件,事件名称为channel + ":" + message.event

客户端代码

客户端我们也使用socket.io,作为测试,代码尽量简化,仅仅打印一个接受到的数据即可。如下:

var socket = io("http://localhost:6001");
socket.on("connection", function (data) {
    console.log(data);
});
socket.on("test-channel:AppEventsSomeEvent", function(message){
    console.log(message);
});
console.log(socket);
服务器触发事件

直接在router中定义个事件触发即可。如下:

Route::get("/event", function(){
    Event::fire(new AppEventsSomeEvent(3));
    return "hello world";
});
测试

启动redis

启动websocket

打开带有客户端代码的页面,可以看到websocket已经连接成功。

触发事件,打开另一个页面 localhost/event

这时就可以发现,第一个页面的console中打印出了Object{user_id: 3},说明广播成功。

我录了一个教学视频,大家如有不明白可以参考这个视频。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20968.html

相关文章

  • Laravel 即时应用的一种实现方式

    摘要:即时交互的应用在现代的应用中很多场景都需要运用到即时通讯,比如说最常见的支付回调,与三方登录。在生成事件时,已经自动添加了该命名空间,该契约只约束方法。会将事件中的允许公开访问的数据通过给定的频道发布出去。 即时交互的应用 在现代的 Web 应用中很多场景都需要运用到即时通讯,比如说最常见的支付回调,与三方登录。这些业务场景都基本需要遵循以下流程: 客户端触发相关业务,并产生第三方应...

    NeverSayNever 评论0 收藏0
  • 基于Model Event模型事件的Laravel实时APP

    摘要:重点是在页面写入新文本,页面不能实时显示。想要了解更多可以参考这篇文章基于驱动的事件广播下测试实时功能刷新页面,并观察数据库。测试实时创建功能。 说明:本文主要来源于real-time-apps-laravel-5-1-event-broadcasting 本文主要基于Laravel的Model Event介绍该框架的实时通信功能,Laravel模型的生命周期中包含事件:created...

    afishhhhh 评论0 收藏0
  • Theano - 广播(broadcasting)

    摘要:广播广播是这样的一个机制它允许不同维度的张量进行加法或者乘法运算。如上图,广播一个行矩阵。和分别表示和指明沿着哪个维度可以进行广播。如果第二个参数是向量,它的形状为,以及它的广播模式为。当可用的时候,广播信息将会以变量的类型给出。 广播(Broadcasting) 广播是这样的一个机制:它允许不同维度的张量进行加法或者乘法运算。在运算时,他将会沿着维度缺失的方向复制较小的那个张量。 通...

    whjin 评论0 收藏0
  • 简单 16步走一遍 Laravel Echo 的使用

    摘要:在国内,个人还是不推荐使用,访问速度有所影响,而且其还是一个商业产品。今天利用最简便的步,走一遍代码集成和来使用。代码简单创建监听我们在后端添加一个被创建的事件,并继承。 showImg(https://segmentfault.com/img/remote/1460000015801244?w=904&h=241); 先飚几句英文,说说 Laravel Echo 的作用: One o...

    chavesgu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<