带有 cron 的 Laravel 队列工作器

问题描述 投票:0回答:3

我正在尝试让我的网站在每次有人新注册时发送确认电子邮件。

在阅读完相关内容后,我按照下面的方式做了,但我仍然不相信这是最好的方法。

在我的 cron 中每分钟运行并调用

php artisan schedule:run

在我的控制台/内核中

protected function schedule(Schedule $schedule)
{
    $schedule->command('queue:work --once')->everyMinute()->withoutOverlapping();
}

我添加了 --once 参数,因为完成后队列工作程序不存在,并且我不希望每分钟运行许多新进程。

有没有一种方法可以让队列工作人员完成所有作业并退出,然后在一分钟后再次启动它,这样我就没有很多实例,或者只是一个实例??

我读到我可以返回null来退出worker,但是如果可以这样做,那么我如何才能在最后一个工作完成后才返回null?

laravel cron laravel-queue
3个回答
34
投票

对于任何仍在寻找解决方案的人,在 laravel 5.7 中,他们添加了支持运行队列中的所有作业,然后在所有作业完成后停止队列工作线程。

你的 cronjob 应该运行这个:

php /path/to/laravel/artisan queue:work --stop-when-empty

Github 上的队列工作命令源代码

另外还有一个适用于旧版本 Laravel 的软件包

orobogenius/sansdaemon


0
投票

在 Laravel 5.7 之后,queue:work 作为守护进程运行,一旦命令启动,它将继续运行,直到手动停止。您不需要运行 cron 作业来每分钟一次又一次地运行它。 要保持queue:work进程在后台永久运行,您应该使用进程监视器(例如Supervisor)来确保队列工作进程不会停止运行。队列:工作进程可能会因多种原因而停止运行,例如超出工作超时或执行队列:重新启动命令。 Supervisor 可以检测您的队列:工作进程何时退出并自动重新启动它们。

Supervisor 将确保工作队列始终在后台运行。以下是导师链接

https://laravel.com/docs/10.x/queues#supervisor-configuration

每当新用户在您的网站上注册时,调度的作业就会添加到队列中。永久有效的歌手工作将执行该工作。如果您每小时有数千个工作,则使用 Supervisor 您可以一次启动多个工作人员。


0
投票

对于任何寻找替代解决方案的人:

非时间敏感队列工作(例如发送电子邮件)的一种方法是将任务添加到每分钟启动队列工作程序的调度程序;

将此行添加到

schedule
中的
app\Console\Kernel.php
方法中,然后设置一个 cron 作业来运行调度程序,确保队列每分钟得到服务。

$schedule->command('queue:work --stop-when-empty')
             ->everyMinute()
             ->withoutOverlapping();

然后,创建调度程序 cron 作业,例如:

* * * * * /usr/local/bin/php /home/{account_name}/live/artisan schedule:run
© www.soinside.com 2019 - 2024. All rights reserved.