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
开始
创建广播事件
-
使用 php artisan make:event PushMsgEvent,创建事件类
-
编写事件类
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'; } }
-
编写路由及控制器,用于展示弹幕和发送弹幕
class BroadcastingController extends Controller { /** * 展示弹幕显示页面 */ public function index() { return view("broadcasting.index"); } /** * 接受前端弹幕请求,并触发广播事件 */ public function put( Request $request ) { broadcast( new PushMsgEvent( $request->msg ) ); } }
安装各种需要的 node 包
-
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 的开启或关闭,这个需要使用守护进程在服务器上运行
-
socket.io 客户端
npm install --save laravel-echo
npm install --save socket.io-client
前端页面编写
-
修改 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');
-
编写 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 ); // 这里只是弹出弹幕消息,滚动的效果就不做了 });
-
运行 npm run dev 生成 broadcasting.js 文件
-
编写 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>
开始验收效果
- 开启 Socket.IO 服务端进程,laravel-echo-server start
- 开始队列处理进程 php artisan queue:work --timeout=30
- 利用 php 提供的内部服务器 php artisan serve
- 在输入弹幕消息之后,弹幕展示页面便会将消息弹出
踩坑
- laravel 6.0 的 redis 有一个前缀配置,需要设置为空,否则在队列时间中也会默认加上这个前缀信息,导致广播失败。
参考
- https://learnku.com/index.php/docs/laravel...
- http://silverd.cn/2018/06/01/laravel-broad...
- https://www.iwhao.top/article/24
本作品采用《CC 协议》,转载必须注明作者和本文链接
lumen 5.2可以用不?
@123wild ,应该是大同小异