Laravel 新 WebSocket 服务 Reverb 使用指南

旧篇 => Laravel/Lumen 中使用 Echo + Socket.IO-Client 实现网页即时通讯广播 https://blog.csdn.net/maxsky/article/details/130394420 已过时
与时俱进,Laravel 官方在 2024 年 7 月发布了 laravel/reverb 包的正式版,因为之前使用的 laravel-echo-server 所使用的 socket.io-client 是比较老旧的 2.0 版本(而且是依赖 NodeJS,内存占用高)
所以更新了此博文帮助大家入门 laravel/reverb 的使用

内容与之前博文大同小异,我亦同步更新了 Laravel Echo 客户端的 Demo 供大家参考

laravel/reverb 最低支持框架版本为 Laravel 10.47+ 以及 PHP 8.2,博文发布时 Laravel 10 版本为 10.48.25,此处使用该框架作为示例(截止博文发布,laravel/reverb 未支持 Lumen 框架

安装

执行 composer require laravel/reverb 安装 Reverb 即可

如果遇到网络问题,可参考该博文解决:Composer 2 镜像处理方案

安装成功后在项目根目录运行 php artisan,可以看到 reverb 相关命令表示安装成功

配置

因为在 Laravel 10 中不存在 php artisan install 命令,所以部分工作需要我们手动完成

首先执行

php artisan reverb:install

该命令行会在 Laravel 10 框架中卡住,我们只需要检查下方相关内容是否成功变更后中断执行即可

  1. 检查 config/app.php 文件底部 providers 部分 是否取消注释 // App\Providers\BroadcastServiceProvider::class, 行,如果没有请手动取消,使 BroadcastServiceProvider 类启用;
  2. 检查 config/broadcasting.php 文件 connections 部分是否出现了 reverb 连接内容;
  3. 检查 config 目录中是否出现了 reverb.php 配置文件;
  4. 检查根目录 .env 文件是否新增了 类似 如下内容:
    REVERB_APP_ID=122822
    REVERB_APP_KEY=1vskpuauarymbej0on7d
    REVERB_APP_SECRET=nyk2kyajfnb0h86yrnoh
    REVERB_HOST="localhost"
    REVERB_PORT=8080
    REVERB_SCHEME=httpVITE_REVERB_APP_KEY="${REVERB_APP_KEY}"
    VITE_REVERB_HOST="${REVERB_HOST}"
    VITE_REVERB_PORT="${REVERB_PORT}"
    VITE_REVERB_SCHEME="${REVERB_SCHEME}"
    
    需特别注意在命令执行期间可能造成 .env 中出现连续两个空行的情况,请自行删掉一行

如果上方 项没有问题,可以 中断 reverb:install 命令

因为 Reverb 同样依赖了广播服务,我们需要在 .env 中修改或新增:

BROADCAST_DRIVER=reverb

发送广播

广播由事件组成,也就是说 因为发生了什么事,需要通知给某个人或者直接公布(所有人)

或者这样形容:广播就是喇叭,事件是通过喇叭“吼叫”(通知/发送)出去的。这就是我们需要创建事件的原因

事件

执行下方命令创建事件类 TestEvent

php artisan make:event TestEvent

该命令会在 app/Events 目录下创建 TestEvent 类。目前这个类非常简单,他有一个 broadcastOn 方法,也就是 通知给谁

注意这里默认的通知是一个 PrivateChannel,也就是 私有频道。为了更简单的完成我们的示例,我们将其更改为 Channel,并将中间的字符串更改为 channel-pub(意为公共频道 public)

接着我们再为该类新增 public 修饰符的 $message$broadcastTime 成员变量并修改构造函数,现在代码看起来是这样:

public string $message;
public string $broadcastTime;/*** Create a new event instance.*/
public function __construct(string $message) {$this->message = $message;$this->broadcastTime = Carbon::now()->toDateTimeString();
}

广播

上方我们虽然创建了需要广播的事件,但是这个事件并不会被(通过)广播发出去,因为事件类需要 实现 Illuminate\Contracts\Broadcasting\ShouldBroadcastIlluminate\Contracts\Broadcasting\ShouldBroadcastNow 接口

ShouldBroadcastNow立即广播,而 ShouldBroadcast异步广播。根据需求你也应该知道使用哪一个接口,这里我们首先使用 ShouldBroadcastNow 进行接下来的操作

当前整个类的代码如下:

<?phpnamespace App\Events;use Carbon\Carbon;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;class TestEvent implements ShouldBroadcastNow {use Dispatchable, InteractsWithSockets, SerializesModels;public string $message;public string $broadcastTime;/*** Create a new event instance.*/public function __construct(string $message) {$this->message = $message;$this->broadcastTime = Carbon::now()->toDateTimeString();}/*** Get the channels the event should broadcast on.** @return array<int, Channel>*/public function broadcastOn(): array {return [new Channel('channel-pub'),];}
}

测试发送广播

和旧篇一样,编写一个测试路由即可。为了方便,我们在 routes/web.php 上方新增一个 Get 路由:

Route::get('/test_broadcast', function () {event((new App\Events\TestEvent('测试消息,Hello')));return 'Event broadcasted!';
});

然后继续下面的操作

接收广播

运行 Reverb 服务,在项目根目录执行:php artisan reverb:start --debug,加上 debug 参数便于我们查询运行情况

如果没有问题,你会得到如下提示:

 INFO  Starting server on 0.0.0.0:8080 (localhost).

注意这个 0.0.0.08080 是基于 config/reverb.php 配置文件中的 hostport 决定

你可以在 .env 中配置 REVERB_SERVER_HOSTREVERB_SERVER_PORT 进行更改。该配置主要决定 Reverb 服务的地址和端口

下方提供两种方式进行测试,大家可以选择自己方便的一种即可

WebSocket 测试软件

例如 Postman、Apifox 等,这里以 Apifox 为例

在 Apifox 中新建 WebSocket 接口,接口地址填入 ws://127.0.0.1:8080/app/REVERB_APP_KEY。注意把 REVERB_APP_KEY 替换为你 .env 文件中对应值,8080 端口对应 REVERB_SERVER_HOST

这里 127.0.0.1 似乎不能用 localhost 代替

填入地址后点击 连接,如果没有问题将得到下方结果:

{"event": "pusher:connection_established","data": "{\"socket_id\":\"676776035.185533755\",\"activity_timeout\":30}"
}

接着在消息中填入下方内容并点击 发送

{"event": "pusher:subscribe","data": {"auth": "","channel": "channel-pub"}
}

得到订阅成功通知:

{"event": "pusher_internal:subscription_succeeded","data": "{}","channel": "channel-pub"
}

此时可以打开浏览器请求你项目的路由 /test_broadcast,浏览器会显示 Event broadcasted! 表明广播已发送。

注意如果连接断开,重新连接并重新发送消息订阅即可

如果没有问题,你会收到类似下方广播内容表明接收成功:

{"event": "App\\Events\\TestEvent","data":"{\"message\":\"\中\文\测\试\",\"broadcastTime\":\"2025-01-08 03:05:20\"}","channel": "channel-pub"
}

Laravel-Echo-Client-Demo

这是一个前端 Demo 便于调试,地址:https://github.com/maxsky/Laravel-Echo-Client-Demo

通过 git 命令 clone 到本地后按 README.md 操作即可

在浏览器中运行该项目,然后请求 /test_broadcast 路由将会得到类似下方结果:

WebSocket 消息测试
你也可以多次请求,网页内容不会清空:

WebSocket 客户端消息 Demo
以上就是即时广播的收发

异步广播

前文有提到,ShouldBroadcastNow立即广播,而 ShouldBroadcast异步广播。异步广播依赖 Redis 队列,所以在 .env 中需要配置好 Redis 连接以及修改 QUEUE_CONNECTION 配置为 redis

队列名

队列名在事件类中指定,我们在 TestEvent 类中添加下方内容:

public string $queue = 'broadcast';

在未指定的情况下,事件会存入 default 默认队列

此时新开命令窗口,在项目根目录下执行:

php artisan queue:work --queue=broadcast

随后浏览器中刷新请求 /test_broadcast 测试路由。有没有发现一个有趣的事,接收到的消息变成了:

{"queue": "broadcast","message": "测试消息,Hello","broadcastTime": "2025-01-08 03:21:28"
}

没错,默认情况下 消息会将所有 public 成员变量广播出去,让我们接着修改

指定广播内容

TestEvent 类中新增 broadcastWith 方法指定广播内容,经过一系列的修改,现在事件类看起来是这样:

<?phpnamespace App\Events;use Carbon\Carbon;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;class TestEvent implements ShouldBroadcast {use Dispatchable, InteractsWithSockets, SerializesModels;public string $queue = 'broadcast';public string $message;public string $broadcastTime;/*** Create a new event instance.*/public function __construct(string $message) {$this->message = $message;$this->broadcastTime = Carbon::now()->toDateTimeString();}/*** Get the channels the event should broadcast on.** @return array<int, Channel>*/public function broadcastOn(): array {return [new Channel('channel-pub'),];}/*** @return array*/public function broadcastWith(): array {return ['name' => 'MyTestEvent','message' => $this->message,'broadcastTime' => $this->broadcastTime];}
}

可以注意到我们在 broadcastWith 中手动指定了返回内容,我们 重新启动队列(修改事件后队列需要重启才会生效)并再次请求 /test_broadcast 路由:

在这里插入图片描述

我们成功过滤了 queue 成员变量,这保障了我们的隐私信息不会暴露出去

最后

Laravel Reverb 简化了操作和授权,具体的授权可参阅官方文档

熟悉之前 Socket.IO-Client 方式的小伙伴能更快上手,美中不足的是现在官方还未支持 Lumen 框架

此外在 Laravel-Echo-Client-Demojs/app.js 代码内有相关说明,需要修改对应的 REVERB_APP_KEY 之类才可成功连接到 Reverb 服务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/66538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WEB攻防-通用漏洞_文件上传_黑白盒审计流程

目录 前置知识点 Finecms-CMS文件上传 ​编辑 Cuppa-Cms文件上传 Metinfo-CMS 文件上传 前置知识点 思路&#xff1a; 黑盒就是寻找一切存在文件上传的功能应用 1 、个人用户中心是否存在文件上传功能 2 、后台管理系统是否存在文件上传功能 3 、字典目录扫描探针文件上传构…

Agentic RAG 解释

RAG&#xff08;检索增强生成&#xff09;通过提供来自外部知识源的相关背景来帮助提高 LLM 答案的准确性和可靠性。 Agentic RAG 是高级 RAG 版本&#xff0c;它使用 AI 代理来更加自主地行动。 Agentic RAG 执行以下操作 查询理解、分解和重写检索策略选择知识库管理结果综…

apex安装

安装过程复杂曲折&#xff0c;网上说的很多办法&#xff0c;貌似成功了&#xff0c;实际还是没起作用。 先说成功过程&#xff0c;执行下面命令&#xff0c;安装成功&#xff08;当然&#xff0c;前提是你要先配置好编译环境&#xff09;&#xff1a; &#xff08;我的环境&a…

基于FPGA的出租车里程时间计费器

基于FPGA的出租车里程时间计费器 功能描述一、系统框图二、verilog代码里程增加模块时间增加模块计算价格模块上板视频演示 总结 功能描述 &#xff08;1&#xff09;&#xff1b;里程计费功能&#xff1a;3公里以内起步价8元&#xff0c;超过3公里后每公里2元&#xff0c;其中…

jdk8升级JDK21(Springboot2.7.18升级Springboot3.4.0)

目录 背景&#xff1a; 一、maven升级 二、代码改造 2.1 javax替换为jakarta 2.2 swagger2升级swagger3相关更新 2.2.1 新增SpringDocConfig配置类 2.2.2 全局代码更新 2.2.3 全局代码替换&#xff08;普通正则替换&#xff09; 2.3 Mybatis Plus升级 2.4 logback.xm…

AI赋能跨境电商:魔珐科技3D数字人破解出海痛点

跨境出海进入狂飙时代&#xff0c;AI应用正在深度渗透并重塑着跨境电商产业链的每一个环节&#xff0c;迎来了发展的高光时刻。生成式AI时代的大幕拉开&#xff0c;AI工具快速迭代&#xff0c;为跨境电商行业的突破与飞跃带来了无限可能性。 由于跨境电商业务自身特性鲜明&…

【HarmonyOS NEXT】鸿蒙应用实现屏幕录制详解和源码

【HarmonyOS NEXT】鸿蒙应用实现屏幕录制详解和源码 一、前言 官方文档关于屏幕录制的API和示例介绍获取简单和突兀。使用起来会让上手程度变高。所以特意开篇文章&#xff0c;讲解屏幕录制的使用。官方文档参见&#xff1a;使用AVScreenCaptureRecorder录屏写文件(ArkTS) 二…

Android - NDK:编译可执行程序在android设备上运行

在android开发中&#xff0c;调试时会把C代码直接编译成可执行程序&#xff0c;运行在android设备上以确认其功能是否正常。 1、基于NDK编译可执行文件 2、push到 /data/local/tmp目录下 3、设置权限&#xff0c;执行。 ndk工程中build.gradle设置 groovy plugins {id com.a…

用matlab调用realterm一次性发送16进制数

realterm采用PutString接口进行发送&#xff0c;需要注意的是发送的16进制数前面要加入0x标志。只有这样&#xff0c;realterm才能将输入的字符串识别为16进制数的形式。 另外,PutString函数支持两个参数输入&#xff0c;第一个参数为字符串&#xff0c;第二个参数为发送形式&…

Python3刷算法来呀,贪心系列题单

1.7号题单 1、​​​​​​k次取反后最大值 2、柠檬水找零 3、分发糖果 示例 1&#xff1a; 输入&#xff1a;ratings [1,0,2] 输出&#xff1a;5 解释&#xff1a;你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。示例 2&#xff1a; 输入&#xff1a;ratings…

el-table拖拽表格

1、拖拽插件安装 npm i -S vuedraggable // vuedraggable依赖Sortable.js&#xff0c;我们可以直接引入Sortable使用Sortable的特性。 // vuedraggable是Sortable的一种加强&#xff0c;实现组件化的思想&#xff0c;可以结合Vue&#xff0c;使用起来更方便。 2、引入拖拽函数…

Unity学习笔记(七)使用状态机重构角色攻击

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 攻击状态重构 首先我们重构攻击状态的动画 之前的动画&#xff0c;我们是使用状态(isAttacking)攻击次数(comboCounter)完成动画的过渡&#xff0c;这样虽然能完成功能&#xff0c;但是如…

Windows10环境下安装RabbitMq折腾记

最近有个老项目需要迁移到windows10环境&#xff0c;用的是比较老的rabbitmq安装包&#xff0c;如下所示。经过一番折腾&#xff0c;死活服务起不来&#xff0c;最终果断放弃老版本启用新版本。现在把折腾过程记录下&#xff1a; 一、安装erlang 安装完成后的目录结构&#xff…

了解RabbitMQ中的Exchange:深入解析与实践应用

在分布式系统设计中&#xff0c;消息队列&#xff08;Message Queue&#xff09;扮演着至关重要的角色&#xff0c;而RabbitMQ作为开源消息代理软件的佼佼者&#xff0c;以其高性能、高可用性和丰富的功能特性&#xff0c;成为了众多开发者的首选。在RabbitMQ的核心组件中&…

分布式主键ID生成方式-snowflake雪花算法

这里写自定义目录标题 一、业务场景二、技术选型1、UUID方案2、Leaf方案-美团&#xff08;基于数据库自增id&#xff09;3、Snowflake雪花算法方案 总结 一、业务场景 大量的业务数据需要保存到数据库中&#xff0c;原来的单库单表的方式扛不住大数据量、高并发&#xff0c;需…

Linux 系统搭建网络传输环境汇总

Ubuntu 系统搭建 TFTP 服务器 1. 创建 /home/username/workspace/tftp 目录并赋予最大权限&#xff0c;username 是自己用户名 sudo mkdir -p /home/username/workspace/tftp sudo chmod 777 /home/username/workspace/tftp 2. 安装 tftp-hpa&#xff08; 客户端软件包&#x…

“AI智慧语言训练系统:让语言学习变得更简单有趣

大家好&#xff0c;我是你们的老朋友&#xff0c;一个热衷于探讨科技与教育结合的产品经理。今天&#xff0c;我想和大家聊聊一个让语言学习变得不再头疼的话题——AI智慧语言训练系统。这个系统可是我们语言学习者的福音&#xff0c;让我们一起来揭开它的神秘面纱吧&#xff0…

线性代数考研笔记

行列式 背景 分子行列式&#xff1a;求哪个未知数&#xff0c;就把b1&#xff0c;b2放在对应的位置 分母行列式&#xff1a;系数对应写即可 全排列与逆序数 1 3 2&#xff1a;逆序数为1 奇排列 1 2 3&#xff1a;逆序数为0 偶排列 将 1 3 2 只需将3 2交换1次就可以还原原…

精选2款.NET开源的博客系统

前言 博客系统是一个便于用户创建、管理和分享博客内容的在线平台&#xff0c;今天大姚给大家分享2款.NET开源的博客系统。 StarBlog StarBlog是一个支持Markdown导入的开源博客系统&#xff0c;后端基于最新的.Net6和Asp.Net Core框架&#xff0c;遵循RESTFul接口规范&…

关于FPGA中添加FIR IP核(采用了GOWIN EDA)

文章目录 前言一、IP核二、MATLAB文件三、导出系数COE文件1.设计滤波器2.用官方的matlab代码或者直接用文本文件 四、进行模块化设计源文件 前言 FIR滤波器的特点是其输出信号是输入信号的加权和&#xff0c;权值由滤波器的系数决定。每个系数代表了滤波器在特定延迟位置上的“…