0

0

Laravel如何使用Job Batching任务批处理_Laravel多个异步任务进度追踪【方法】

冰火之心

冰火之心

发布时间:2026-01-05 18:53:01

|

341人浏览过

|

来源于php中文网

原创

Job Batching 是 Laravel 8.5+ 原生队列批处理机制,需 database/redis 驱动,通过 Bus::batch() 创建含 then/catch/finally 回调的 Batch 实例并 dispatch() 异步执行,状态由 job_batches 表自动维护,前端应通过 BatchRepository 查询进度。

laravel如何使用job batching任务批处理_laravel多个异步任务进度追踪【方法】

Job Batching 是 Laravel 8.5+ 原生支持的特性,不是插件或第三方包

如果你还在用 dispatch() 逐个推任务、再靠数据库字段手动记进度,说明你没启用 Laravel 自带的批处理机制。Job Batching 要求最低 Laravel 版本为 8.5,且必须使用 databaseredis 作为队列驱动(sync 不支持)。它本质是把一批 Job 封装成一个 Batch 实例,由框架统一追踪完成数、失败数、取消状态等元数据。

如何创建并分发一个 Batch(含实际参数控制)

不要用 Bus::batch() 后直接 dispatch() —— 这会立刻执行,失去异步意义。正确流程是先构建 Batch,再调用 dispatch() 推入队列:

use Illuminate\Support\Facades\Bus;

$batch = Bus::batch([
    new SendNotificationJob($user1),
    new SendNotificationJob($user2),
    new SendNotificationJob($user3),
])->then(function (Batch $batch) {
    \Log::info('所有通知发送完成', ['batch_id' => $batch->id]);
})->catch(function (Batch $batch, Throwable $e) {
    \Log::error('批处理中发生错误', ['batch_id' => $batch->id, 'error' => $e->getMessage()]);
})->finally(function (Batch $batch) {
    \Log::info('无论成功失败都会执行', ['batch_id' => $batch->id]);
})->dispatch();

// 注意:此时 $batch->id 已生成,但尚未开始执行
// 可立即用于前端轮询或存入 session
  • Bus::batch([...]) 接收 Job 实例数组,每个 Job 必须实现 ShouldQueue
  • then()/catch()/finally() 回调在「整个 Batch 生命周期结束时」触发,运行在单独的 Job 中(需确保该 Job 也能被正常消费)
  • 默认超时为 24 小时,可通过 timeout() 方法修改:->timeout(3600)

前端如何实时查 Batch 进度(关键字段和查询方式)

Batch 状态不依赖你自建表,Laravel 在 job_batches 表中自动维护。最常用字段是:total_jobspending_jobsfailed_jobsfinished_jobsfailed_job_ids(JSON 字符串)、options(含 timeout 等)。查询示例:

GPTBots
GPTBots

企业级AI智能体构建平台

下载
// 控制器中提供进度接口
public function batchStatus(string $batchId)
{
    $batch = \Illuminate\Bus\BatchRepository::make()->find($batchId);

    if (! $batch) {
        return response(['message' => 'Batch not found'], 404);
    }

    return response([
        'id' => $batch->id,
        'name' => $batch->name ?? 'unnamed',
        'progress' => $batch->progress(), // 自动计算百分比(0–100)
        'status' => $batch->status(),      // 'pending'|'running'|'finished'|'cancelled'|'failed'
        'total' => $batch->totalJobs,
        'processed' => $batch->finishedJobs + $batch->failedJobs,
        'failed' => $batch->failedJobs,
        'cancelled' => $batch->cancelledJobs,
    ]);
}
  • $batch->progress() 是安全的,即使部分 Job 还没被消费,也会按已知总数估算(例如 5/10 → 50%)
  • 不要用 DB::table('job_batches')->where(...)->first() 直接查——可能读到未刷新的缓存或脏数据;务必走 BatchRepository
  • 前端轮询建议间隔 ≥ 2 秒,避免压垮队列驱动(尤其是 Redis)

常见失败场景和绕过坑点

Batch 失败不等于所有 Job 都失败,但某些配置会让整个 Batch 卡死:

  • 某个 Job 抛出未被捕获的异常,且没定义 catch() 回调 → Batch 状态变为 failed,剩余 pending Job 不再执行
  • Job 内部调用 sleep() 或阻塞 I/O(如同步 HTTP 请求)→ 可能导致单个 Job 超时,进而触发 failed,但 job_batches.failed_job_ids 只存 ID,不存错误堆
  • 使用 database 驱动时,若队列 worker 意外退出(如 OOM),Batch 状态可能卡在 running → 需配合 php artisan queue:restart 和定期清理脚本
  • Batch 名称(name())默认为空,调试困难 → 强烈建议显式命名:->name('user-import-batch-'.$importId)

真正难排查的是「Batch 显示 finished,但部分 Job 实际没执行」——这通常是因为 Job 构造函数中传入了不可序列化的对象(如 Eloquent Model 实例),导致反序列化失败、静默丢弃。务必只传 ID 或基础类型。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2217

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1472

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1374

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

951

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1412

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1233

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1443

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

漫蛙2入口地址合集
漫蛙2入口地址合集

本专题整合了漫蛙2入口汇总,阅读专题下面的文章了解更多详细内容。

162

2026.01.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.4万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号