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

时间:2018-09-11 09:45:33

标签: laravel cron

我的Laravel应用程序有一个queued event listener,并且我还设置了cronjob以使其每分钟运行schedule:run

但是我不知道如何在后台持久运行php artisan queue:worker命令。我发现this thread是投票率最高的方法:

$schedule->command('queue:work --daemon')->everyMinute()->withoutOverlapping();

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

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

2 个答案:

答案 0 :(得分:3)

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

ffmpeg ... | ./stitch | magick ppm:- result.jpg

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

步骤

  1. 创建新命令:php artisan queue:work --stop-when-empty
  2. $ php artisan make:command SendContactEmails中,更改:SendContactEmails.php
  3. protected $signature = 'emails:work';方法中,添加:
handle()
  1. return $this->call('queue:work', [ '--queue' => 'emails', // remove this if queue is default '--stop-when-empty' => null, ]); 文件中,将命令添加到您的命令列表中:
app/Console/Kernel.php
  1. 每分钟安排一次命令:
protected $commands = [
    \App\Console\Commands\SendContactEmails::class
];
  1. 更新您的cronjobs:
protected function schedule(Schedule $schedule)
{
    $schedule->command('emails:work')->everyMinute();
    // you can add ->withoutOverlapping(); if you think it won't finish in 1 minute
}

Source

  

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

     

* * * * * /usr/local/bin/php /home/username/project/artisan schedule:run > /dev/null 2>&1 选项可用于指示工作人员处理所有作业,然后正常退出。如果您希望在队列为空后关闭该容器,请在Docker容器中处理Laravel队列时使用此选项:

--stop-when-empty

答案 1 :(得分:0)

您正在使用cpanel吗?

您可以在SchedulerCron Jobs菜单中进行设置。 并在其中设置命令