php - 处理完所有作业后,Laravel 作业从数组中获取总数
问题描述
在我的 Laravel 8 应用程序中,我使用 Jobs 和 Batches 来分块,并处理从 CSV 插入多行数据。上传时,我的 CSV 被分块,一个批次包含所有作业,每个作业有 1,000 条记录要插入,因此作业循环遍历每条记录,并通过我用于格式化数据的函数将它们插入数据库。
我想在导入与批处理相关的所有作业期间创建某种累积错误总数,但不确定如何执行此操作,因为现在它仅在每 1,000 个客户被导入后运行,而我已经有50k。
如何在所有正在处理的作业结束时获得所有可能抛出的错误的总数?
<?php
namespace App\Jobs;
use Illuminate\Bus\Batchable;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
use Carbon\Carbon;
class CustomersCsvProcess implements ShouldQueue
{
use Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels, ApplicationSecurity, Applications;
/**
* Hold CSV errors
*/
protected $csvErrors = [];
/**
* Data
*/
public $data;
/**
* Header
*/
public $header;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($data, $header)
{
$this->data = $data;
$this->header = $header;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
foreach ($this->data as $customer) {
$customerData = array_combine($this->header, (array) $customer);
$formattedCustomer = null;
// format applicant to insert
try {
$formattedCustomer = $this->mapApplication($customerData);
} catch (\Exception $e) {
array_push($this->csvErrors, $e->getMessage());
}
}
// TODO: how to log $dumpErrors after all 50k insertted rather than after each job?
$dumpErrors = array_count_values($this->csvErrors);
var_dump($dumpErrors);
}
}
解决方案
推荐阅读
- html - 带有 React 的 CSS 边框导航栏
- android - 如何确定手机是否有缺口
- angularjs - 如何在子指令中访问父控制器的功能
- android - 如何获取存储在使用 context.getDir(directoryName, Context.MODE_PRIVATE) 创建的文件夹中的文件的 URI?
- electron - Electron - ipcRenderer 在异步类中不起作用
- spring-webflux - 反应堆网络客户端
- javascript - 如何在 iframe 中更改 src 函数
- java - 地图在导航抽屉上时不显示当前位置
- android - 如何将 firebase 注册用户与现有 firebase 数据库进行比较
- python - 处理全局“几乎常量”的推荐模式是什么?