0

0

Laravel 之 广播 模块详解

藏色散人

藏色散人

发布时间:2020-04-12 14:12:31

|

4368人浏览过

|

来源于segmentfault

转载

本文是基于laravel 5.4版本的广播模块代码进行分析书写;

推荐:《laravel教程

简介

广播是指发送方发送一条消息,订阅频道的各个接收方都能及时收到消息;比如 A同学写了一篇文章,这时候 B同学在文章底下评论了,A同学在页面上是不用刷新就能收到提示有文章被评论了,这个本质上就是A同学收到了广播消息,这个广播消息是由B同学评论这个动作触发了发送广播消息;

在整个广播行为中,有一个重要的概念叫频道channel,频道的类型有

● 公共频道public

● 私有频道private

● 存在频道presence

移动端订阅了公共频道public,会直接提示成功;私有频道private和存在频道presence在进行订阅的过程中,会向服务器端发送权限验证,看是不是有权限可以订阅该频道;私有频道private和存在频道presence的区别在于,私有频道private能够接收其他成员发送的消息,而存在频道presence除此之外,还能够在用户的加入与离开时接收信息;

广播适合以下场景(此小部分摘自基于 Pusher 驱动的 Laravel 事件广播(上)):

● 通知(Notification) 或 信号(Signal)

通知是最简单的示例,也最经常用到。信号也可看作是通知的一种展现形式,只不过信号没有UI而已。

● Activity Streams

Activity Streams(feeds)是社交网络的核心。如微信朋友圈的点赞和评论,A可以实时看到B的点赞,B可以实时看到A的评论。

● 聊天

聊天信息的实时显示

模块组成

63a85b598b852504861af75775114ad.png

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');
    }
}

第三步,触发事件,发送广播;有好几种触发广播方式:

1.直接事件触发

KesionEshop 在线商城系统 X1.0.150526(utf-8)
KesionEshop 在线商城系统 X1.0.150526(utf-8)

KesionCMS是漳州科兴信息技术有限公司开发的一套万能建站产品,是CMS行业最流行的网站建设解决方案之一。最新版X1.0把主系统及一些辅助系统模块化开发,前后台UI采用HTML5全新架构,方便随时删除(隐藏)安装所需要的模块。应广大用户群体建议,此次版本改动所有涉及编辑器和视频播放的模块,全部采用百度编辑器(ueditor)及ckplayer视频播放器,改进后的视频(flv,mp4等格式视频)

下载
event(new Illuminate\Auth\Events\Login($user, true));

2.帮助函数broadcast,间接触发事件

broadcast(new Illuminate\Auth\Events\Login($user, true));

3.广播管理类,间接触发事件,直接广播

$manager = app(Illuminate\Broadcasting\BroadcastManager::class);
$manager->event(new Illuminate\Auth\Events\Login($user, true));

4.广播管理类,间接触发事件,放入队列

$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

准备工作

事件监听

后台的事件监听还是采用"日志驱动"部分的登录例子;

前端

前端页面引入以下代码:


如果订阅的是公共频道,则不会向服务器端请求权限检查;如果是私有频道(频道名是以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']);

间接广播

参考“日志驱动”提及的间接广播方式;

如果要发送排我广播(也就是除了当前请求的这个客户端不收到广播消息),则需要以下条件:

1.事件使用Illuminate\Broadcasting\InteractsWithSockets trait;

2.前端发送过来的请求头部要携带X-Socket-ID信息;

3.事件触发执行broadcast(new Illuminate\Auth\Events\Login($user, true))->toOthers();

Redis驱动

配置

.env文件修改或添加一行:BROADCAST_DRIVER=redis;

广播

原理是同样在后端部署一个Socket.IO服务器,Laravel框架会发布消息到Socket.IO服务器上,由Socket.IO服务器同浏览器端或者移动端保持长连接;

这部分笔者尚未demo,网上入门资料还是挺多的,知道原理,这部分动作上手就容易多了;

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2742

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1673

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1532

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

995

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1464

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1235

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1549

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1307

2023.11.13

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号