Laravel помещает много данных в очередь

#php #laravel #eloquent

#php #laravel #красноречивый

Вопрос:

У меня есть модель с ~ 500 тыс. записей в базе данных. Мне нужно получить все элементы и поместить ~ 500 тыс. заданий в очередь.

Я пытался:

 Model::cursor()->each(function ($item) {
    dispatch(new Job($item));
});
// and
Model::chunk(10000, function ($items) {
    foreach ($items as $item) {
        dispatch(new Job($item));
    }
});
  

Но в обоих случаях у меня произошла утечка памяти, потому что в любом случае мне нужно перебрать все 500 тыс. записей и вызвать dispatch() метод. Есть ли лучший способ отправить большое количество данных в очередь Laravel?

Ответ №1:

В вашем случае может сработать работа только с идентификаторами. Попробуйте.

Отправка

 Model::select('id')
      ->get()
      ->pluck('id')
      ->each(function ($id) {
          Job::dispatch($id);
      });
  

Задание

 class Job implements ShouldQueue
{
    use Dispatchable, Queueable, InteractsWithQueue;

    protected $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

    public function handle()
    {
        $item = Model::find($this->id);
        // do some stuff
    }
}
  

Комментарии:

1. Намного лучше, спасибо. Но у меня все еще есть утечка памяти, я думаю, я должен разбить этот огромный результат на куски и использовать что-то вроде пакетной обработки заданий…