laravel6中使用广播推送消息
使用laravel广播推送消息
项目是基于laravel6开发的一个论坛项目,里面有公告和私信功能,需求要求做到实时推送
方案
- 使用php socket 搭建
- 使用laravel自带的广播
php socket在laravel中使用搭建起来比较麻烦,而且要封装函数,对于一个小功能来说成本太高,决定使用laravel自带的广播功能来实现
laravel广播驱动类型
- pusher
- 官方默认的,收费
- redis
- 可搭配socket.io使用
最终方案
使用laravel广播基于redis驱动搭配socket.io实现该功能
因为要使用node.js安装相关包,要先安装node.js
- 打开laravel默认关闭的广播服务
config\app.php
- 注释掉redis配置里的前缀设置(laravel中默认有前缀)
config'database.php
- 修改
.env
文件中的修改广播驱动为redis
4.安装laravel中redis扩展,这里以predis为列
composer require predis/predis
安装完成后设置.env
中的REDIS_CLIENT
设置为predis
如果不想设置,可以调整config\database.php
中的clinet
默认为predis
- 安装依赖
// 更新依赖npm install//安装负责处理socket的node.js包npm install -g laravel-echo-server//安装前端事务处理包npm install --save socket.io-client
npm install --save laravel-echo//运行socket服务laravel-echo-server init//启动laravel-echo-server start
运行成功
- 查看npm安装包
- 创建一个event
php artisan make:event TestEvent
代码如下
<?phpnamespace App\Events;use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;class TestEvent implements ShouldBroadcast
{use Dispatchable, InteractsWithSockets, SerializesModels;public $message;/*** Create a new event instance.** @return void*/public function __construct($test){//$this->message = $test;}// 广播频道public function broadcastOn(){// return new PrivateChannel('channel-name');return new Channel('test_public_channel');}// 广播内容public function broadcastWith(){return ['data' => $this->message];}// 广播事件名称,默认为 App\Events\TestEventpublic function broadcastAs(){return 'TestEvent';}// 决定是否广播的条件public function broadcastWhen(){if ('test') {return true;}}
}
- 前端接收广播
//需要加入token 广播强制要求<meta name="csrf-token" content="{{ csrf_token() }}">//引入socket.io.js<script src="//{{ Request::getHost() }}:6001/socket.io/socket.io.js"></script><script type="module">
//在js中引入echo.jsimport Echo from '/static/echo.js';//初始化echowindow.Echo = new Echo({broadcaster: 'socket.io',host: 'http://' + window.location.hostname + ':6001'});//公共频道window.Echo.channel('test_public_channel').listen('.TestEvent', (e) => { // 注意,如果在laravel事件中用broadcastAs方法设置了广播事件名称,则这里监听的事件名称前要加"."。console.log(e);});</script>
注:如果找不到echo.js文件,在项目下node_modules\laravel-echo\dist
找到echo.js
复制到对应的目录下即可
- 调用方法
broadcast(new TestEvent('你的文章被点赞了'));
前端收到对应消息
- 私有频道
推送消息是时候用到了私有频道,操作如下:
- 创建一个私有频道的event
php artisan make:event PrivateEvent
,代码如下:
<?phpnamespace App\Events;use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;class PrivateEvent implements ShouldBroadcast
{use Dispatchable, InteractsWithSockets, SerializesModels;protected $user_id;protected $info;/*** Create a new event instance.** @return void*/public function __construct($user_id,$info){$this->user_id =$user_id;$this->info = $info;}/*** Get the channels the event should broadcast on.** @return \Illuminate\Broadcasting\Channel|array*/public function broadcastOn(){return new PrivateChannel('user-'.$this->user_id);}public function broadcastAs(){return 'PrivateEvent';}public function broadcastWith(){$data = ['id'=>$this->user_id,'type'=>$this->info['type'],'message'=>$this->info['message']];return ['data'=>$data];}
}
2.在路由channel.php
中设置如下内容
//这里的意思只有前端用户才有权限Broadcast::channel('user-.{user_id}', function ($user_id, $data) {return true;
},['guards'=>'web']);
3.前端代码
//需要加入token 广播强制要求<meta name="csrf-token" content="{{ csrf_token() }}">//引入socket.io.js<script src="//{{ Request::getHost() }}:6001/socket.io/socket.io.js"></script><script type="module">
//在js中引入echo.jsimport Echo from '/static/echo.js';//初始化echowindow.Echo = new Echo({broadcaster: 'socket.io',host: 'http://' + window.location.hostname + ':6001'});//调用私有频道监控window.Echo.private("user-{{auth()->id()}}").listen('.PrivateEvent', (e) => {// 注意,如果在laravel事件中用broadcastAs方法设置了广播事件名称,则这里监听的事件名称前要加"."。console.log(e);})</script>
laravel6中使用广播推送消息相关推荐
- activemq中怎么知道推送消息是否成功_ActiveMQ安装试用示列
ActiveMQ安装配置和使用简例 ActiveMQ是一套JMS(Java Message Service)开源消息服务实现的组件.以Windows操作系统为例,本文简述了ActiveMQ的安装配置和 ...
- WCF服务通过TCP实时监控客户端状态,并可以向客户端广播推送消息,实现双向通信
仅供参考:未经允许,不得转载. 前段时间在做WCF开发的过程中,用户需要在服务端对客户端进行监控,需要知道客户端什么时候上线,什么时候下线,当然服务端也可以给客户端推送信息,就是所谓的双向通信了. 要 ...
- activemq中怎么知道推送消息是否成功_如何优雅的使用activeMQ 安装、应用、安全认证、持久化...
ActiveMQ安装 1. 下载资源 ActiveMQ官网: 版本说明 ActiveMQ5.10.x以上版本必须使用JDK1.8才能正常使用. ActiveMQ5.9.x及以下版本使用JDK1.7即可 ...
- html5 plus.push,HTML5+规范:Push(管理推送消息功能)
Push模块管理推送消息功能,可以实现在线.离线的消息推送,通过plus.push可获取推送消息管理对象. 1.方法 1.1.addEventListener: 添加推送消息事件监听器 void pl ...
- Pushlet实现定点推送消息与浏览器参数交互详解
今天在这里讲解一下关于开源框架Pushlet中的定点推送消息和与浏览器参数交互 通过上面的方法我就可以完成点对点的网页版本的聊天软件了,当然需要达到上面的要求我们这里需要对Pushlet的源码进 ...
- Java中集成极光推送实现给Android提送消息通知(附代码下载)
场景 Android中集成极光推送实现推送消息通知与根据别名指定推送附示例代码下载: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details ...
- Android中集成Jpush实现推送消息通知与根据别名指定推送附示例代码下载
场景 经常会有后台服务向Android推送消息通知的情况. 实现 首先在Android Studio中新建一个Android应用 在Project根目录的build.gradle中配置了jcenter ...
- 如何发布日历提醒推送消息服务器,iOS开发 -- 通过app向手机自带的日历中添加事件提醒...
在如今实际开发中,我们会有一种需求---通过自己的app往系统自带的日历中添加提醒事件. 一: 首先上最后效果图: WechatIMG7.jpeg 下图是关于添加事件的详情 WechatIMG8.jp ...
- 持续集成之企业微信通知:5:在Jenkins中向企业微信推送消息
在这篇文章中结合具体的示例来介绍在Jenkins中如何向企业微信群推送消息. 环境准备 这里使用Easypack的Jenkins 2.164.3来创建验证用的Jenkins环境.使用如下步骤即可完成. ...
最新文章
- 为什么程序员不能接私活?
- 哥伦比亚大学「机械手」无需提前了解抓握物体,也能灵活适应形状!
- MySQL同步复制搭建方法指南详细步骤
- python几种排序_python各种排序算法
- 我们又来送书啦!这一次,用做业务的思维讲推荐系统 | 文末福利
- 【华为云技术分享】云小课 | SAP容灾一点通
- CSS也能控制表格的交替颜色
- Moto X的谷歌基因
- WPE制作游戏外挂 更改封包
- 台达触摸屏DOP-B系列——通过宏和子画面弹出提示框
- oracle odac 客户端 区别,ODAC使用指南 (一)ODAC常见问题集
- 20179214 2017-2018-2 《密码与安全新技术》第一周作业
- GNSS观测数据下载地址
- Beyond compare4激活使用
- 树莓派装专用服务器系统,Raspberry Pi 树莓派安装64位系统打造全功能NAS [全网最正确操作记录]...
- 图的匹配---图论笔记
- Linux下的网络配置
- 电子设计教程17:从共射极放大电路到射极跟随电路
- Linux笔记 No.22---(Linux - PAM)
- 飞机上允许携带哪些移动电源?