如何在共享主机上运行队列工作器

Tan*_*may 0 cron laravel

我的Laravel应用程序有一个排队的事件侦听器,我还设置了cronjob以使其schedule:run每分钟运行一次。

但是我不知道如何php artisan queue:worker在后台持久运行命令。我在最受好评的方法中找到了该线程

$schedule->command('queue:work --daemon')->everyMinute()->withoutOverlapping();
Run Code Online (Sandbox Code Playgroud)

但是,在另一个线程上,有些人抱怨上述命令创建了多个队列工作器。

如何安全地运行队列工作器?

emo*_*ity 5

从Laravel 5.7开始,有一个新的队列命令在空时停止工作:

php artisan queue:work --stop-when-empty

由于这主要是用于电子邮件或少量的小型工作,因此我将其放在cronjob上,以便每分钟运行一次。我说这并不是每分钟超过100个工作的解决方案,但可以处理我的电子邮件。发送电子邮件的时间大约为每分钟5秒,具体取决于发送的电子邮件数量或工作量。

脚步

  1. 创建新命令: php artisan make:command SendContactEmails
  2. 在中SendContactEmails.php,更改:protected $signature = 'emails:work';
  3. handle()方法中,添加:
return $this->call('queue:work', [
    '--queue' => 'emails', // remove this if queue is default
    '--stop-when-empty' => null,
]);
Run Code Online (Sandbox Code Playgroud)
  1. 每分钟安排一次命令:
protected function schedule(Schedule $schedule)
{
    $schedule->command('emails:work')->everyMinute();
    // you can add ->withoutOverlapping(); if you think it won't finish in 1 minute
}
Run Code Online (Sandbox Code Playgroud)
  1. 更新您的cronjobs:
* * * * * /usr/local/bin/php /home/username/project/artisan schedule:run > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

资源

处理所有排队的作业,然后退出

--stop-when-empty选项可用于指示工作人员处理所有作业,然后正常退出。如果您希望在队列为空后关闭该容器,请在Docker容器中处理Laravel队列时使用此选项:

php artisan queue:work --stop-when-empty
Run Code Online (Sandbox Code Playgroud)