前言

本文主要给大家介绍了关于Laravel广播模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:
注意:本文是基于Laravel 5.4版本的路由模块代码进行分析书写;
简介
广播是指发送方发送一条消息,订阅频道的各个接收方都能及时收到消息;比如 A同学写了一篇文章,这时候 B同学在文章底下评论了,A同学在页面上是不用刷新就能收到提示有文章被评论了,这个本质上就是A同学收到了广播消息,这个广播消息是由B同学评论这个动作触发了发送广播消息;
在整个广播行为中,有一个重要的概念叫频道channel,频道的类型有
移动端订阅了公共频道public,会直接提示成功;私有频道private和存在频道presence在进行订阅的过程中,会向服务器端发送权限验证,看是不是有权限可以订阅该频道;私有频道private和存在频道presence的区别在于,私有频道private能够接收其他成员发送的消息,而存在频道presence除此之外,还能够在用户的加入与离开时接收信息;
广播适合以下场景:
模块组成
Demo
日志驱动
配置
.env文件修改或添加一行:BROADCAST_DRIVER=log;
广播
直接调用
$manager = app(Illuminate\Broadcasting\BroadcastManager::class); $driver = $manager->connection(); // 第一个参数是频道名,第二个参数是事件名,第三个参数是广播内容 $driver->broadcast(['channel_1', 'channel_2'], 'login', ['message' => 'hello world']);
因为是日志驱动,所以广播内容会写到框架配置的日志文件中,输出消息如下所示
[2017-08-18 20:45:49] local.INFO: Broadcasting [login] on channels [channel_1, channel_2] with payload:
{
"message": "hello world"
}
监听事件广播
这种调用方式,是当实现ShouldBroadcast接口的事件被触发时,则会进行广播操作;(同时,还有一个接口叫ShouldBroadcastNow,与ShouldBroadcast接口的不同在于,将实现ShouldBroadcastNow接口的事件放入队列中时,会被放入叫sync的队列中)
举个例子,
第一步,Illuminate\Auth\Events\Login事件是用户登录成功后会触发的事件,略作改动,让其实现广播功能;
class Login implements ShouldBroadcast {
......
// 定义事件被触发时,广播频道;此处定义名为 first-channel 的私有频道
public function broadcastOn() {
return [
new PrivateChannel('first-channel'),
];
}
// 自定义广播名称;如果方法未定义,默认以类名为事件名,此处的默认值是 Illuminate\Auth\Events\Login
public function broadcastAs() {
return 'login';
}
}
第二步,注册事件监听;在app/Providers/EventServiceProvider.php中修改:
protected $listen = [ ...... 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\UserLogin', ], ];
文件app/Listeners/UserLogin.php粗糙地实现了一下:
class UserLogin {
public function __construct() {}
public function handle(Login $event){
\Log::info('Do UserLogin Listener: I was Login');
}
}
第三步,触发事件,发送广播;有好几种触发广播方式:
直接事件触发
event(new Illuminate\Auth\Events\Login($user, true));
帮助函数broadcast,间接触发事件
broadcast(new Illuminate\Auth\Events\Login($user, true));
广播管理类,间接触发事件,直接广播
$manager = app(Illuminate\Broadcasting\BroadcastManager::class); $manager->event(new Illuminate\Auth\Events\Login($user, true));
广播管理类,间接触发事件,放入队列
$manager = app(Illuminate\Broadcasting\BroadcastManager::class); $manager->queue(new Illuminate\Auth\Events\Login($user, true));
Pusher驱动
Pusher是一个第三方服务,服务器发送广播时,会向Pusher发送请求,再通过Pusher与浏览器或移动端保持的长连接进行数据交互;
配置
通过Pusher官网注册用户信息,获取属于自已的一套密钥信息,修改.env的配置文件;
BROADCAST_DRIVER=pusher PUSHER_APP_ID=xxxxxxxxxxxxxxxxxxxxxx PUSHER_APP_KEY=xxxxxxxxxxxxxxxxxxxxxx PUSHER_APP_SECRET=xxxxxxxxxxxxxxxxxxxxxx
准备工作
事件监听
后台的事件监听还是采用"日志驱动"部分的登录例子;
前端
前端页面引入以下代码:
<script src="https://js.pusher.com/4.1/pusher.min.js"></script>
<script>
// 打开 Pusher 的调试日志
Pusher.logToConsole = true;
// 定义 Pusher 变量
var pusher = new Pusher('PUSHER_APP_KEY的值', {
cluster: 'ap1',
encrypted: true
});
// 定义频道,绑定事件
var channel = pusher.subscribe('private-first-channel');
channel.bind('login', function(data) {
alert(data);
});
</script>
如果订阅的是公共频道,则不会向服务器端请求权限检查;如果是私有频道(频道名是以private-开头)或存在频道(频道名是以presence-开头),则会发出权限检查请求;对应的后端需要定义私有频道和存在频道的权限;
频道权限定义
频道的权限定义是在routes/channels.php里;此处笔者为first-channel频道定义权限回调函数:
Broadcast::channel('first-channel', function ($user) {
return (int) $user->id === 1;
});
有读者会疑问,前端页面订阅的频道不是private-first-channel吗?怎么后端只定义first-channel频道的权限呢?那是因为,后端定义的频道假设是A,那么在Pusher及浏览器端或移动端传递的私有频道名为private-A,存在频道则会是presence-A;
广播
直接广播
$manager = app(Illuminate\Broadcasting\BroadcastManager::class); $driver = $manager->connection(); // socket 参数是广播私有频道时排除的 socket, 每个浏览器端或者移动端在建立 websocket 时都会被分配一个 socket_id $driver->broadcast(['private-first-channel'], 'login', ['user' => ['name' => 'hello'], 'socket' => '5395.4377611']);
间接广播
参考“日志驱动”提及的间接广播方式;
如果要发送排我广播(也就是除了当前请求的这个客户端不收到广播消息),则需要以下条件:
Redis驱动
配置
.env文件修改或添加一行:BROADCAST_DRIVER=redis;
广播
原理是同样在后端部署一个Socket.IO服务器,Laravel框架会发布消息到Socket.IO服务器上,由Socket.IO服务器同浏览器端或者移动端保持长连接;
这部分笔者尚未demo,网上入门资料还是挺多的,知道原理,这部分动作上手就容易多了;
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
附录
同类型的文章可参考以下,加深了解:
# laravel
# 模块
# 广播
# 5.4
# Laravel中的Auth模块详解
# Laravel学习教程之View模块详解
# Laravel学习教程之本地化模块
# Laravel学习教程之路由模块
# 基于Laravel实现的用户动态模块开发
# 后端
# 则会
# 会向
# 这部
# 管理类
# 的是
# 是一个
# 是在
# 相关内容
# 第一个
# 就能
# 说了
# 都能
# 是由
# 是指
# 不多
# 也可
# 第二个
# 给大家
# 还有一个
相关文章:
利用JavaScript实现拖拽改变元素大小
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
建站之星CMS五站合一模板配置与SEO优化指南
,购物网站怎么盈利呢?
网站制作需要会哪些技术,建立一个网站要花费多少?
,网页ppt怎么弄成自己的ppt?
深圳网站制作的公司有哪些,dido官方网站?
制作表格网站有哪些,线上表格怎么弄?
建站之星代理如何优化在线客服效率?
如何在景安云服务器上绑定域名并配置虚拟主机?
,制作一个手机app网站要多少钱?
如何通过商城自助建站源码实现零基础高效建站?
C++如何编写函数模板?(泛型编程入门)
建站DNS解析失败?如何正确配置域名服务器?
如何在Windows 2008云服务器安全搭建网站?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
建站之星各版本价格是多少?
建站之星展会模板:智能建站与自助搭建高效解决方案
电商平台网站制作流程,电商网站如何制作?
建站之星官网登录失败?如何快速解决?
如何在IIS中新建站点并配置端口与IP地址?
建站主机选哪家性价比最高?
相册网站制作软件,图片上的网址怎么复制?
如何快速生成凡客建站的专业级图册?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
高防服务器租用首荐平台,企业级优惠套餐快速部署
平台云上自主建站:模板化设计与智能工具打造高效网站
如何有效防御Web建站篡改攻击?
如何快速搭建高效香港服务器网站?
如何在建站宝盒中设置产品搜索功能?
香港服务器租用费用高吗?如何避免常见误区?
如何用好域名打造高点击率的自主建站?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
微信h5制作网站有哪些,免费微信H5页面制作工具?
英语简历制作免费网站推荐,如何将简历翻译成英文?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
建站之星IIS配置教程:代码生成技巧与站点搭建指南
专业商城网站制作公司有哪些,pi商城官网是哪个?
学校免费自助建站系统:智能生成+拖拽设计+多端适配
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何将凡科建站内容保存为本地文件?
建站之星2.7模板快速切换与批量管理功能操作指南
,南京靠谱的征婚网站?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
Python路径拼接规范_跨平台处理说明【指导】
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
*请认真填写需求信息,我们会在24小时内与您取得联系。