ms_dizzy_ Job constructor'üne bu kadar veri vermek doğru değil. Kuyruk işlemlerinde bu tür verilerin hafif olması lazım çünkü bu veriler serialize edilip kuyruğa alınıyor ve tekrar unserialize ediliyor, veri ne kadar büyük olursa o kadar çok ram ve işlemci yer. Eğer böyle kayıtları seçerek dışarı aktarma işlemi yapıyorsanız ve bu kadar çok kayıt oluyorsa benim tavsiyem ayrı bir tabloda dışarı aktarılacak kayıtları tutmanız. Ayrıca yanlış chunk kullanmışsınız, eğer performans için yaptıysanız tüm kayıtları get ile çektikten sonra Collection::chunk() kullanmanın kayıtları gruplamak dışında bir faydası yok.
Mesela Export isimli bir tablonuz olsun:
+----+-----------------+--------+------------------------+
| id | exportable_type | format | ids |
+----+-----------------+--------+------------------------+
| 1 | App\Models\User | xlsx | [1,2,3,4,5,6,...,3000] |
+----+-----------------+--------+------------------------+
ids alanının jsonb olduğunu düşünün.
Önce gelen kayıtlardan bir tane Export işlemi oluşturun ve onun id'sini job'a verin.
$export = Export::create([
'exportable_type' => User::class,
'ids' => $request->input('data'),
'format' => $request->input('format'),
]);
ExportUserTrackingJob::dispatch($export->id);
Job içinde de:
$export = Export::findOrFail($this->exportId);
User::select('email', 'date')
->whereIn('id', $export->ids)
->chunk(1000, function($users) use ($export) { // Siz chunk'ı yanlış kullanmışsınız...
foreach($users as $user) {
if($export->format === 'xlsx') {
// ...
}
}
});
Ayrıca burası Job Batching kullanmak için iyi bir yer:
https://laravel.com/docs/10.x/queues#job-batching