@AFI19

Почему Job обновляет только половину данных?

Есть Job который должен обновить записи в бд. Проблема в том, что за каждый запуск он обновляет только половину. И так при каждом запуске, всегда только ~50%. Начинает с 7500, 3800, 1900, и тд.
В логах ошибок нет. Почему так происходит?
[2020-11-08 23:50:26][58] Processing: App\Jobs\FixNonUniqueAddresses
[2020-11-08 23:50:40][58] Processed:  App\Jobs\FixNonUniqueAddresses

<?php

namespace App\Jobs;

use App\Models\Address;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class FixNonUniqueAddresses implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $timeout = 1000;

    public function __construct()
    {
        //
    }

    public function handle()
    {
        Address::where('addressable_type', 'places')->whereNull('type')->chunkById(
            50,
            function ($addresses) {
                $addresses->each(function ($address) {
                    $newData = transformStreet(
                        $address->street,
                        $address->lang
                    );
                    $address->update($newData);
                });
            }
        );
    }
}
  • Вопрос задан
  • 100 просмотров
Решения вопроса 1
@vism
потому что ты обновляешь условие, по которому делаешь выборку.
ну смотри, у тебя 1000 записей например, ИД от 1 до 1000
Ты берешь первые 50 , обновляешь. остаётся 950 не обновлённых
А chunk делает limit +50
И следующая выборка у тебя начинается с отступом в 50 записей, в итоге записи с ИД 51-100 пропущены, а обновятся 101-150.
лимит опять +50
еще 50 пропущены и так далее.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
pLavrenov
@pLavrenov
Разработка сайтов
Возможно время выполнения мешает этому. Лучше всего переделать этот job так чтобы он создавал много мелких job вместо обработки всех записей сейчас. Кроме того такой job забивать слот в очереди надолго.

Поставь horizon и там будет видно что с ними происходит.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы