Начиная с Laravel 5.7, есть новая команда очереди, которая перестает работать, когда пуста:
php artisan queue:work --stop-when-empty
Поскольку это в основном только для электронных писем или нескольких небольших заданий, я помещаю их наКронджоб, чтобы бежать каждую минуту.Я бы сказал, что это решение не для более чем 100 заданий в минуту, но работает для моих электронных писем.Это будет выполняться примерно 5 секунд каждую минуту только для отправки писем, в зависимости от того, сколько писем или насколько велико задание.
Шаги
- Создать новую команду:
php artisan make:command SendContactEmails
- В
SendContactEmails.php
изменить: protected $signature = 'emails:work';
- В методе
handle()
добавить:
return $this->call('queue:work', [
'--queue' => 'emails', // remove this if queue is default
'--stop-when-empty' => null,
]);
Расписание вашей команды каждую минуту:
protected function schedule(Schedule $schedule)
{
$schedule->command('emails:work')->everyMinute();
// you can add ->withoutOverlapping(); if you think it won't finish in 1 minute
}
Обновите ваши cronjobs:
* * * * * /usr/local/bin/php /home/username/project/artisan schedule:run > /dev/null 2>&1
Источник
Обработка всех заданий в очереди и затем выход
Параметр --stop-when-empty
может использоваться для указания работнику обрабатывать все задания и затем корректно завершать работу.Эта опция может быть полезна при работе с очередями Laravel в контейнере Docker, если вы хотите закрыть контейнер после того, как очередь пуста:
php artisan queue:work --stop-when-empty