Laravel中如何将队列任务进度以百分比形式持久化存储到数据库?

2026-05-03 00:223阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计884个文字,预计阅读时间需要4分钟。

Laravel中如何将队列任务进度以百分比形式持久化存储到数据库?

在任务类中使用 Eloquent 更新记录时,直接在行内更新即可,但应避免使用模型事件和事务处理。Laravel 队列默认不开启数据库事务,但如果在手动开启(如在 job handle 方法中使用 DB::transaction)时更新进度,进度更新可能会被回滚。

  • dispatch() 时传入一个唯一 $jobId 或用 $this->job->uuid() 生成标识,避免多个相同任务互相覆盖
  • 别在 __construct() 里查或改模型——构造阶段模型状态不可靠,且部分驱动(如 Redis)会序列化对象,Eloquent 模型容易出错
  • DB::table('job_progress')->upsert() 替代先查后 save,避免并发写冲突;字段至少包含 job_uuidprogressupdated_at

Laravel 10+ 的 InteractsWithQueue 怎么配合进度更新

这个 trait 提供了 $this->job 实例,里面能拿到 uuid() 和当前尝试次数,是天然的进度锚点。但注意:它只在 handle() 执行时才完整可用,不能在 failed() 或构造函数里依赖它。

阅读全文
标签:Laravel

本文共计884个文字,预计阅读时间需要4分钟。

Laravel中如何将队列任务进度以百分比形式持久化存储到数据库?

在任务类中使用 Eloquent 更新记录时,直接在行内更新即可,但应避免使用模型事件和事务处理。Laravel 队列默认不开启数据库事务,但如果在手动开启(如在 job handle 方法中使用 DB::transaction)时更新进度,进度更新可能会被回滚。

  • dispatch() 时传入一个唯一 $jobId 或用 $this->job->uuid() 生成标识,避免多个相同任务互相覆盖
  • 别在 __construct() 里查或改模型——构造阶段模型状态不可靠,且部分驱动(如 Redis)会序列化对象,Eloquent 模型容易出错
  • DB::table('job_progress')->upsert() 替代先查后 save,避免并发写冲突;字段至少包含 job_uuidprogressupdated_at

Laravel 10+ 的 InteractsWithQueue 怎么配合进度更新

这个 trait 提供了 $this->job 实例,里面能拿到 uuid() 和当前尝试次数,是天然的进度锚点。但注意:它只在 handle() 执行时才完整可用,不能在 failed() 或构造函数里依赖它。

阅读全文
标签:Laravel