Laravel中如何将队列任务进度以百分比形式持久化存储到数据库?
- 内容介绍
- 文章标签
- 相关推荐
本文共计884个文字,预计阅读时间需要4分钟。
在任务类中使用 Eloquent 更新记录时,直接在行内更新即可,但应避免使用模型事件和事务处理。Laravel 队列默认不开启数据库事务,但如果在手动开启(如在 job handle 方法中使用 DB::transaction)时更新进度,进度更新可能会被回滚。
-
dispatch()时传入一个唯一$jobId或用$this->job->uuid()生成标识,避免多个相同任务互相覆盖 - 别在
__construct()里查或改模型——构造阶段模型状态不可靠,且部分驱动(如 Redis)会序列化对象,Eloquent 模型容易出错 - 用
DB::table('job_progress')->upsert()替代先查后 save,避免并发写冲突;字段至少包含job_uuid、progress、updated_at
Laravel 10+ 的 InteractsWithQueue 怎么配合进度更新
这个 trait 提供了 $this->job 实例,里面能拿到 uuid() 和当前尝试次数,是天然的进度锚点。但注意:它只在 handle() 执行时才完整可用,不能在 failed() 或构造函数里依赖它。
本文共计884个文字,预计阅读时间需要4分钟。
在任务类中使用 Eloquent 更新记录时,直接在行内更新即可,但应避免使用模型事件和事务处理。Laravel 队列默认不开启数据库事务,但如果在手动开启(如在 job handle 方法中使用 DB::transaction)时更新进度,进度更新可能会被回滚。
-
dispatch()时传入一个唯一$jobId或用$this->job->uuid()生成标识,避免多个相同任务互相覆盖 - 别在
__construct()里查或改模型——构造阶段模型状态不可靠,且部分驱动(如 Redis)会序列化对象,Eloquent 模型容易出错 - 用
DB::table('job_progress')->upsert()替代先查后 save,避免并发写冲突;字段至少包含job_uuid、progress、updated_at
Laravel 10+ 的 InteractsWithQueue 怎么配合进度更新
这个 trait 提供了 $this->job 实例,里面能拿到 uuid() 和当前尝试次数,是天然的进度锚点。但注意:它只在 handle() 执行时才完整可用,不能在 failed() 或构造函数里依赖它。

