#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. Намного лучше, спасибо. Но у меня все еще есть утечка памяти, я думаю, я должен разбить этот огромный результат на куски и использовать что-то вроде пакетной обработки заданий…