广播应用场景百度一大堆就不说了,我配置时因为.env
文件原因跳坑略恶心,上步骤:
event+redis+predis+laravel-echo+socket.io+queue
别忘了启动redis,laravel-echo-server,queue
bootstrap.js修改后要重编译:npm run dev
1.生成event事件:
命令:php artisan make:event EventName
EventName随便起的是文件名;
broadcastOn() //定义广播 Channel是公共广播 PrivateChannel是私人广播
broadcastAs() //定义频道名 如不定义默认为当前文件名,定义后使用时前缀需加.
继承了ShouldBroadcast
接口,触发事件后进行广播
2.配置驱动
config下的broadcasting文件
四种驱动:pusher,redis,log,null,我这里用的redis
注意:开发环境config配置后要去.env文件配置一下,默认先使用env文件配置
配置驱动连接:
圈出来的地方为连接名前缀,如不注释需使用时加上对应前缀。.env
对应配置项BROADCAST_DRIVER=redis
配置驱动为redis,QUEUE_CONNECTION=sync
配置队列形式为同步。
注意:QUEUE_CONNECTION=database是异步队列形式加载,需要启动队列服务php artisan queue:work
sync同步不需要,并发请求过大时建议异步。
3.加载驱动包
命令:composer require predis/predis
至此服务端配置完成。
4.配置客户端
加载socket.io
命令:npm install --save socket.io-client
在客户端实例化socket.io,我是将其实例化在bootstrap.js中,因为我bootstrap.js全局引用了。
require引入socket,broadcaster指定连接,host指定地址与端口,其余配置大多用不上,我已经注释掉。
运行一个与 Laravel 兼容的 Socket.IO 服务器
使用官方推荐的laravel-echo
下载命令:npm install laravel-echo-server -g
初始化:laravel-echo-server init
执行这条命令后,会询问你一些关于 Socket 服务的配置信息:
// 是否在开发模式下运行此服务器(y/n) 输入y
? Do you want to run this server in development mode? (y/N)
// 设置服务器的端口 默认 6001 输入 6001就可以了 或者你想要的
? Which port would you like to serve from? (6001)
// 想用的数据库 选择 redis
? Which database would you like to use to store presence channel members? (Use arrow keys)
❯ redis
sqlite
// 这里输入 你的laravel 项目的访问域名
? Enter the host of your Laravel authentication server. (http://localhost)
// 选择 网络协议 http
? Will you be serving on http or https? (Use arrow keys)
❯ http
https
// 您想为HTTP API生成客户端ID/密钥吗 N
? Do you want to generate a client ID/Key for HTTP API? (y/N)
// 要设置对API的跨域访问吗?(y/n)N
Configuration file saved. Run laravel-echo-server start to run server.
启动服务与停止服务命令:
laravel-echo-server start //启动
laravel-echo-server stop //停止
5.vue中订阅广播
let vue=new Vue({
el:'xxx',
mounted(){
initEcho();
Echo.channel('package//广播名').listen('.weight//频道名',(e)=>{
//接收到数据后你的逻辑代码
}
}
});
广播名与频道名要与上面Event中定义的一致否则订阅不到指定频道。
注意:redis加前缀的话这里广播名也要加前缀,一般为项目名_database_广播名
,频道名如果用了AS别名前缀需要加一个.
,如果非队列同步情况下需要启动队列服务。
服务器上配置laravel-echo-server时https需要将证书路径配置在laravel-echo中,http需要解决跨域问题