我正在尝试让我的网站在每次有人新注册时发送确认电子邮件。
在阅读完相关内容后,我按照下面的方式做了,但我仍然不相信这是最好的方法。
在我的 cron 中每分钟运行并调用
php artisan schedule:run
在我的控制台/内核中
protected function schedule(Schedule $schedule)
{
$schedule->command('queue:work --once')->everyMinute()->withoutOverlapping();
}
我添加了 --once 参数,因为完成后队列工作程序不存在,并且我不希望每分钟运行许多新进程。
有没有一种方法可以让队列工作人员完成所有作业并退出,然后在一分钟后再次启动它,这样我就没有很多实例,或者只是一个实例??
我读到我可以返回null来退出worker,但是如果可以这样做,那么我如何才能在最后一个工作完成后才返回null?
对于任何仍在寻找解决方案的人,在 laravel 5.7 中,他们添加了支持运行队列中的所有作业,然后在所有作业完成后停止队列工作线程。
你的 cronjob 应该运行这个:
php /path/to/laravel/artisan queue:work --stop-when-empty
另外还有一个适用于旧版本 Laravel 的软件包
在 Laravel 5.7 之后,queue:work 作为守护进程运行,一旦命令启动,它将继续运行,直到手动停止。您不需要运行 cron 作业来每分钟一次又一次地运行它。 要保持queue:work进程在后台永久运行,您应该使用进程监视器(例如Supervisor)来确保队列工作进程不会停止运行。队列:工作进程可能会因多种原因而停止运行,例如超出工作超时或执行队列:重新启动命令。 Supervisor 可以检测您的队列:工作进程何时退出并自动重新启动它们。
Supervisor 将确保工作队列始终在后台运行。以下是导师链接
https://laravel.com/docs/10.x/queues#supervisor-configuration
每当新用户在您的网站上注册时,调度的作业就会添加到队列中。永久有效的歌手工作将执行该工作。如果您每小时有数千个工作,则使用 Supervisor 您可以一次启动多个工作人员。
对于任何寻找替代解决方案的人:
非时间敏感队列工作(例如发送电子邮件)的一种方法是将任务添加到每分钟启动队列工作程序的调度程序;
将此行添加到
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