使用laravel广播推送消息

项目是基于laravel6开发的一个论坛项目,里面有公告和私信功能,需求要求做到实时推送


方案

  1. 使用php socket 搭建
  2. 使用laravel自带的广播

php socket在laravel中使用搭建起来比较麻烦,而且要封装函数,对于一个小功能来说成本太高,决定使用laravel自带的广播功能来实现

laravel广播驱动类型
  1. pusher

    1. 官方默认的,收费
  2. redis
    1. 可搭配socket.io使用
最终方案

使用laravel广播基于redis驱动搭配socket.io实现该功能

因为要使用node.js安装相关包,要先安装node.js

  1. 打开laravel默认关闭的广播服务 config\app.php

  1. 注释掉redis配置里的前缀设置(laravel中默认有前缀) config'database.php

  1. 修改.env文件中的修改广播驱动为redis

4.安装laravel中redis扩展,这里以predis为列

composer require predis/predis

安装完成后设置.env中的REDIS_CLIENT设置为predis
如果不想设置,可以调整config\database.php中的clinet默认为predis

  1. 安装依赖
// 更新依赖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 

运行成功

  1. 查看npm安装包

  1. 创建一个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;}}
}
  1. 前端接收广播
//需要加入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复制到对应的目录下即可

  1. 调用方法
    broadcast(new TestEvent('你的文章被点赞了'));

前端收到对应消息

  1. 私有频道

推送消息是时候用到了私有频道,操作如下:

  1. 创建一个私有频道的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中使用广播推送消息相关推荐

  1. activemq中怎么知道推送消息是否成功_ActiveMQ安装试用示列

    ActiveMQ安装配置和使用简例 ActiveMQ是一套JMS(Java Message Service)开源消息服务实现的组件.以Windows操作系统为例,本文简述了ActiveMQ的安装配置和 ...

  2. WCF服务通过TCP实时监控客户端状态,并可以向客户端广播推送消息,实现双向通信

    仅供参考:未经允许,不得转载. 前段时间在做WCF开发的过程中,用户需要在服务端对客户端进行监控,需要知道客户端什么时候上线,什么时候下线,当然服务端也可以给客户端推送信息,就是所谓的双向通信了. 要 ...

  3. activemq中怎么知道推送消息是否成功_如何优雅的使用activeMQ 安装、应用、安全认证、持久化...

    ActiveMQ安装 1. 下载资源 ActiveMQ官网: 版本说明 ActiveMQ5.10.x以上版本必须使用JDK1.8才能正常使用. ActiveMQ5.9.x及以下版本使用JDK1.7即可 ...

  4. html5 plus.push,HTML5+规范:Push(管理推送消息功能)

    Push模块管理推送消息功能,可以实现在线.离线的消息推送,通过plus.push可获取推送消息管理对象. 1.方法 1.1.addEventListener: 添加推送消息事件监听器 void pl ...

  5. Pushlet实现定点推送消息与浏览器参数交互详解

    今天在这里讲解一下关于开源框架Pushlet中的定点推送消息和与浏览器参数交互    通过上面的方法我就可以完成点对点的网页版本的聊天软件了,当然需要达到上面的要求我们这里需要对Pushlet的源码进 ...

  6. Java中集成极光推送实现给Android提送消息通知(附代码下载)

    场景 Android中集成极光推送实现推送消息通知与根据别名指定推送附示例代码下载: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details ...

  7. Android中集成Jpush实现推送消息通知与根据别名指定推送附示例代码下载

    场景 经常会有后台服务向Android推送消息通知的情况. 实现 首先在Android Studio中新建一个Android应用 在Project根目录的build.gradle中配置了jcenter ...

  8. 如何发布日历提醒推送消息服务器,iOS开发 -- 通过app向手机自带的日历中添加事件提醒...

    在如今实际开发中,我们会有一种需求---通过自己的app往系统自带的日历中添加提醒事件. 一: 首先上最后效果图: WechatIMG7.jpeg 下图是关于添加事件的详情 WechatIMG8.jp ...

  9. 持续集成之企业微信通知:5:在Jenkins中向企业微信推送消息

    在这篇文章中结合具体的示例来介绍在Jenkins中如何向企业微信群推送消息. 环境准备 这里使用Easypack的Jenkins 2.164.3来创建验证用的Jenkins环境.使用如下步骤即可完成. ...

最新文章

  1. POJ 1207 The 3n + 1 problem
  2. python现在最新的版本-Python 3.8 已发布,现在是切换至新版本的好时机吗?
  3. 动态规划----解121. 买卖股票的最佳时机---最大连续子序列和
  4. [PHP]用PHPUnit进行行为驱动开发(Behaviour-Driven Development)
  5. boost::range_result_iterator相关的测试程序
  6. 用计算机求函数公式,计算机常用的函数公式有哪些?
  7. debug error怎么解决_我要以血和泪的经历告诉你,这个 bug 太难解决了
  8. php 保護連接字符串,PHP字符串操作
  9. 火车票线程同步(一)互斥体实现
  10. php获得表单数值,php 表单数据的获取代码
  11. steam加速_PC电脑steam有没有免费试用的加速器?首选电狐加速器
  12. Scara机器人正逆运动学分析
  13. Jersey框架一:Jersey RESTful WebService框架简介
  14. 服务器d盘位置不可用,系统之家Windows7本地磁盘位置不可用拒绝访问的解决方法...
  15. redis 关闭保护模式
  16. 能 ping 通但端口不通时端口可用性探测说明
  17. Channel 接口EventLoop 接口 ChannelFuture 接口
  18. vue3加ts出现 --找不到模块“@/views/HomeView.vue”或其相应的类型声明。
  19. vbs脚本连续发送信息简易版本
  20. 压缩机振动探头本特利330904-06-14-05-02-00

热门文章

  1. DI计数器Modbus TCP协议2路PWM输出WiFi模块
  2. 小心漏洞隐患 你的NETGEAR路由器升级了吗
  3. Log4j中conversionPattern的含义
  4. 新手c语言编译器推荐
  5. The command could not be located because ‘/sbin:/usr/sbin‘ is not included in the PATH.......
  6. 《广播电视安全播出事件/事故管理规定》
  7. Shadows 阴影 光照系列8
  8. 经常上火喝洋槐蜜好不好?洋槐蜜上火吗?
  9. 普歌-码上鸿鹄团队:(tab栏)nuxt+element实现路由传参控制tab栏
  10. 【C++】二叉搜索树