Почему я получил ошибку тайм-аута после постановки в очередь 7 тысяч заданий?

#laravel #laravel-7 #laravel-jobs #laravel-vapor

#ларавель #laravel-7 #laravel-задания #laravel-пар

Вопрос:

Я отправляю около 7 тысяч электронных писем, используя Laravel и SES. Поскольку у меня есть ограничение в 10 электронных писем в секунду, мне нужно задерживать, когда Laravel отправляет все электронные письма партиями по 10 за раз.

Контроллер

 public function queue(){

$invites = Subscriber::all();
$send_at = now();

foreach ($invites as $i => $invite){

    if($i % 10 == 0){
        $send_at = $send_at->addSeconds(1);   
    }

    SendEmailJob::dispatch($invite)->delay($send_at);
}

dd('sent!');
}
 

И эта работа

 public function handle()
{   
    Mail::to($this->user->email)->send(new InviteMail($this->user));

}
 

Это дало мне ошибку тайм-аута, но, как ни странно, он поставил в очередь все 7 тысяч писем и отправил их. Мне просто любопытно, почему я получил ошибку.

Ответ №1:

Поместите эту функцию в начало вашей функции контроллера

 set_time_limit() //In seconds
 

Это увеличит максимальное время выполнения.

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

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

2. Возможно, вы неправильно ставите в очередь. Посмотрите это, это поможет вам поставить почту в очередь Laravel

Ответ №2:

проверьте значение max_execution_time в вашем файле php.ini или используйте set_time_limit(700); в своем function queue()

700 исходят из 7000 приглашений / 10 = 700 сегментов

max_execution_time по умолчанию составляет 300 сегментов

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

1. Но для постановки всех заданий в очередь должно потребоваться всего 1 секунда. Мне не нужно было ждать, пока он отправит все электронные письма. Верно?