Laravel怎么实现队列任务执行进度实时推送_LaravelWebSocket通知前端【教程】

风强吖_1163

风强吖_1163

2026-04-17

178人浏览

原创

队列任务进度实时推送需任务执行时写redis状态并广播事件,前端通过websocket订阅接收,而非dispatch()直接推送;须配置laravelwebsockets为pusher驱动、使用public频道、前端先查初始进度并校验连接与命名一致性。

laravel怎么实现队列任务执行进度实时推送_laravelwebsocket通知前端【教程】

队列任务里怎么把进度发给前端

不能靠 Laravel 自带的 dispatch() 直接推——它只管把任务扔进队列,不负责状态同步。真要实时推送进度,得让任务自己“说话”:执行中主动写状态、前端主动或被动收消息。核心是拆成两件事:任务侧存进度,前端侧连 WebSocket 拿更新。

  • 推荐用 Redis 的 SET 或 HSET 存进度,键名建议含任务 ID(如 job:progress:{uuid}),避免冲突
  • 别用数据库主表存进度——高频率 UPDATE 会拖慢队列消费,尤其并发多时
  • 前端不要轮询 /api/progress/{id},HTTP 轮询延迟高、连接浪费,WebSocket 是更直接的路径

Laravel + LaravelWebSockets 怎么让任务触发通知

关键在任务执行时调用 event() 或直接用 broadcast(),但必须确保广播驱动配对、频道可公开订阅。LaravelWebSockets 默认只处理 pusher 协议广播,所以 BROADCAST_DRIVER=redis 不行,得切到 pusher 并配好 PUSHER_APP_ID 等环境变量,让它把事件转给 WebSocket 服务。

  • 任务里用 broadcast(new JobProgressUpdated($jobId, $percent)),事件类需实现 ShouldBroadcast
  • 频道必须是 public 类型(如 ProgressChannel 中返回 true from join()),private/channel 不被前端直连
  • 前端用 echo.channel('progress.' + jobId) 订阅,频道名要和事件广播的完全一致
  • 如果用 redis 驱动+自定义监听器推 WebSocket,容易漏掉重连逻辑,不如走标准广播链路稳

为什么任务刚 dispatch 就收不到第一条进度

因为广播发生在任务真正执行时,不是分发时。dispatch() 只把任务塞进 Redis 队列,Worker 还没捞起来,自然没进度、没广播。常见错觉是“发了就该有”,其实是时间差问题。

Laravel Creem Agent
Laravel Creem Agent

Creem 支付商店助理 — 查询订阅、客户、交易、产品,执行心跳检查,管理本地 Laravel支付商店。

下载
  • 前端订阅频道后,应先查一次当前进度(比如 GET /api/job/{id}/progress),补上初始状态
  • 任务开头立刻写一次 1% 到 Redis,并广播,避免前端等半天没动静
  • Worker 进程如果卡住(比如内存溢出、死锁),进度就停在那——加个超时检测和失败回调,比等前端问“怎么不动了”更主动

前端收到消息但页面没更新?检查这三处

90% 是频道名拼错、事件名不匹配、或 LaravelWebSockets 服务没跑起来。别急着改 Vue/React 逻辑,先确认底层通路是否真实打通。

  • 用 php artisan websocket:serve 启动后,访问 http://localhost:6001/laravel-websockets 看面板有没有连接数、有没有频道列表
  • 浏览器控制台看 Echo 是否报 Connection refused 或 404 on /laravel-websockets,对应检查 BROADCASTING_URL 和 Nginx 反代配置
  • 事件名默认是类全名(如 App\Events\JobProgressUpdated),前端监听时得写全,或者在事件里覆盖 broadcastAs() 方法简化

进度推送看着简单,实际卡点都在“谁在什么时候写了什么、谁又在什么时候读到了”。中间任何一环断开——Redis 过期、Worker 崩溃、WebSocket 断连未重连、前端频道名少个点——都会让进度停在 5%,而你还在翻 JS 控制台。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2423

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5243

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6290

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5858

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

843

5

laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

857

10

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

2024.04.09

835

9

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

2468

10

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.10

3981

7

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 206人学习

Composer手册
Composer手册

共0课时 | 0人学习