基于 Redis驱动的 Laravel 事件广播

一、前言

之前在项目中需要使用laravel的事件广播,而且项目打算使用redis作为驱动,但发现网上的资料大部分都是Pusher驱动的,只能自己摸索着搭建了一下服务。现在将这个过程记录一下,希望能帮到其他人。

二、项目的环境

事件广播需要用到redis,nodejs,不同的版本在安装过程中会遇到一些问题,大家有兴趣可以看看我之前提过的一个问题:npm install 报错,下面是我开发时的环境:

  • laravel 5.3
  • node v6.11.4
  • redis 3.0.500

三、具体的搭建流程

其实大概的步骤在官方文档上已经给出来了,laravel5.3 官方文档 广播系统,这里我就不讲了,只把整体的流程写下来~

3.1 在config/app.config中取消AppProvidersBroadcastServiceProvider::class的注释

3.2 安装Predis扩展

composer require predis/predis;

3.3 安装laravel-echo-server

npm install -g laravel-echo-server
然后需要将此服务初始化,
laravel-echo-server init

然后按照指引一步一步初始化就好

3.4 将laravel-echo-server 服务加入到resource/asset/app.js



import Echo from "laravel-echo"
window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001' //一定不能用127.0.0.1(因为这个地方用127.0.0.1的时候,其他人访问的时候会找自己的主机,而不是服务器的主机)
});
//这里放要监控的频道名,以及要进行的操作
window.Echo.channel('user1').listen('EventChanged', (e) => {
    console.log(e.name);//比如我要输出传过来的人名
 });

3.5 编译app.js文件

由于app.js此时尚未进行编译,所以需要编译。编译需要用到gulp,所以先安装node的包

- npm install (会在根目录下产生node_modules文件夹)
- npm install安装过程中可能会遇到问题:
      安装过程中如果遇到 deprecate gulp@3.9.1 › vinyl-fs@0.3.14 › glob-stream@3.1.18 › minimatch@^2.0.1
      执行 npm update -g minimatch@3.0.2npm update -g minimatch@3.0.2就可以
- 运行命令:gulp -watch或者npm run dev 将此js编译,此时会报错,can't resolve laravel-echo,解决方法:npm install laravel-echo

到此为止,基本上laravel-echo-server 的服务基本上已经搭好了,现在进行其他工作

3.6 创建要推送的事件,举例TestEvent

3.6.1 生成事件
  php artisan make:event EventChanged    
3.6.2 广播事件需要实现ShouldBrodcast接口
class EventChanged implements ShouldBroadcast
  • 在broadcaston中定义要广播到哪个频道

       public function broadcastOn()
     {
       return new Channel('user1');//比如广播到user1
     }
  • 当一个事件被定义后,其所有public属性都将被序列化,作为广播的信息发送到指定频道。
    //在broadcastWith中自定义要将哪些信息广播出去

     public function broadcastWith()
     {
       return ['name' => 'jack'];
     }
    
  • 在app/provider/BrodcastServiceProvider 的boot中设置广播的频道授权(return 为ture代表授权通过)

    Broadcast::channel('user1', function () {
      return true; //这个里面可以写授权的逻辑判断,我这里直接返回true了,不做验证
    });

3.7 前端页面js的引入

在你的前端页面中引入编译好的js文件,以及socket.io文件

//注意这两个文件的引入顺序
<script src="http://{{Request::getHost()}}:6001/socket.io/socket.io.js"></script>
<script src="js/app.js"></script>

3.8 一些需要配置的配置项

3.8.1 整个环境还需要注意的一些配置项:
  • .env文件中的 broadcastdriver = redis // 因为使用redis驱动,所以要设置好
  • appconfigbroadcasting.php 中’default’ => env(‘BROADCAST_DRIVER’, ‘redis’)
  • .env文件中的 QUEUE_DRIVER,这个代表了队列的驱动方式,因为事件广播将事件扔到默认队列进行推送,所以这个地方有两种设置方式(详情参照laravel队列的相关文档):
    1.QUEUE_DRIVER = sync //这个代表本地驱动,如果采用这个设置的话没什么其他要操作的
    2.QUEUE_DRIVER = database //这个代表采用数据库驱动
3.8.2 如果采用database驱动队列的话首先要运行
  • php artisan queue:table生成jobs表迁移
  • php artisan migrate 执行迁移
  • 运行队列 php artisan queue:work
3.8.3 需要手动开启的服务(均在项目的根目录下执行)
  • redis-server.exe (开启redis服务,一定要启动)
  • laravel-echo-server start (开启socket服务)

四、总结

差不多上面就是所有的过程和步骤了,不知道有没有很清楚。如果有可以帮到大家的地方,那就达到我写这篇文章的目的了。

    原文作者:早起写代码
    原文地址: https://segmentfault.com/a/1190000013863986
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞