Laravel 广播入门,弹幕的实现

laravel 广播介绍

laravel 的广播模块,本质是利用 websocket 建立客户端和服务端的双向链接,通过各种频道进行通信,完成信息的更新显示

开工前准备

  • laravel 6.0 版本
  • laravel 队列,本例使用 redis 作为队列驱动
  • laravel/ui 提供的前端脚手架
  • laravel 事件

配置

  • redis 相关配置
  • 开启广播服务提供者
    在 config/app.php 中取消 App\Providers\BroadcastServiceProvider::class, 前边的注释
  • 设置队列、广播为 redis 驱动
    在 .env 中,设置
    BROADCAST_DRIVER=redis
    QUEUE_CONNECTION=redis

开始

创建广播事件

  1. 使用 php artisan make:event PushMsgEvent,创建事件类

  2. 编写事件类

    class PushMsgEvent implements ShouldBroadcast
    {  
        use Dispatchable, InteractsWithSockets, SerializesModels;
        public $msg;
    
        /**
         *  定义 msg 变量,保存弹幕消息
         */
        public function __construct( $msg )
        {
            // 简单的消息列表
            $this->msg = $msg;
        }
    
        /**
         *  弹幕所有人都可以收到,所以返回公共频道就 OK 的
         */
        public function broadcastOn()
        {
            return new Channel('push');
        }
    
       /**
        *  重命名一下广播名称,一般默认为类名
        */
        public function broadcastAs()
        {
             return 'push.msg';
        }
    }
  3. 编写路由及控制器,用于展示弹幕和发送弹幕

    class BroadcastingController extends Controller
    {
      /**
       * 展示弹幕显示页面
       */
      public function index()
      {
        return view("broadcasting.index");
      }
    
     /** 
      * 接受前端弹幕请求,并触发广播事件
      */
      public function put( Request $request )
      {
            broadcast(  new PushMsgEvent( $request->msg )  );
      }
    }

安装各种需要的 node 包

  1. laravel-echo-server 包,与 laravel 兼容的 Socket.IO 服务器

    • npm install -g laravel-echo-server 全局安装
    • laravel-echo-server init 初始化配置信息,在根目录下生成 laravel-echo-server.json 文件
    • laravel-echo-server start | stop , Socket.IO 的开启或关闭,这个需要使用守护进程在服务器上运行
  2. socket.io 客户端
    npm install --save laravel-echo
    npm install --save socket.io-client

前端页面编写

  1. 修改 webpack.min.js ,生成单独使用的 broadcasting.js 文件

     mix.js('resources/js/app.js', 'public/js')
           .js('resources/js/vue-component.js', 'public/js')
           .js('resources/js/broadcasting.js', 'public/js')  /// 新增
           .sass('resources/sass/app.scss', 'public/css');
  2. 编写 resources/js/broadcasting.js

    // 引入该引入的包
    import Echo from 'laravel-echo';
    window.io = require('socket.io-client');
    window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001'
    });
    window.Echo.channel('push')
    .listen('.push.msg', (e) => {
        alert( e.msg );  // 这里只是弹出弹幕消息,滚动的效果就不做了
    });
  3. 运行 npm run dev 生成 broadcasting.js 文件

  4. 编写 broadcasting.index blade 文件

    <div class="my-container container">
      <div class="col-xs-12" style="min-height: 600px;">
      </div>
    </div>
    <script src="{{ asset('js/broadcasting.js') }}" defer></script>

开始验收效果

  1. 开启 Socket.IO 服务端进程,laravel-echo-server start
  2. 开始队列处理进程 php artisan queue:work --timeout=30
  3. 利用 php 提供的内部服务器 php artisan serve
  4. 在输入弹幕消息之后,弹幕展示页面便会将消息弹出

踩坑

  1. laravel 6.0 的 redis 有一个前缀配置,需要设置为空,否则在队列时间中也会默认加上这个前缀信息,导致广播失败。

参考

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

lumen 5.2可以用不?

4年前 评论
lufeijun1234

@123wild ,应该是大同小异

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!