Laravel 队列(数据库驱动程序)+ Cron 作业(任务调度程序)堆叠并且在服务器崩溃后不再发送
Posted
技术标签:
【中文标题】Laravel 队列(数据库驱动程序)+ Cron 作业(任务调度程序)堆叠并且在服务器崩溃后不再发送【英文标题】:Laravel Queues (Database driver) + Cron job (task scheduler) stacked and are not being sent anymore after server crashed 【发布时间】:2017-10-02 11:36:58 【问题描述】:我已经配置了一个 laravel 队列来发送电子邮件,它曾经可以很好地立即发送电子邮件。
我还使用了laravel任务调度器并配置了queue:listen每分钟执行一次,导致服务器崩溃,因为cron作业一遍又一遍地调用queue:work循环... . 网站崩溃了。而且是客户的现场,所以问题很严重。
托管公司将我的 laravel cron 作业修改为每 5 分钟运行一次。而且由于它崩溃了,所有邮件现在都留在数据库中,并且数据库队列根本不起作用。我猜这个进程根本没有运行。
我有这些问题:
如何执行数据库中的堆叠队列记录? 如何让数据库队列重新工作? 如何配置 cron 作业和 laravel 计划以正常工作。注意:我希望它与数据库驱动程序一起工作,而不是与 redis 或同步或其他东西一起工作,所以请继续关注数据库驱动程序,谢谢。
【问题讨论】:
【参考方案1】:在 Laravel 8 中(在以前的版本中不确定)
php artisan queue:work --stop-when-empty
这个命令可以毫无问题地“croned”。
【讨论】:
【参考方案2】:laravel 任务调度器并配置 queue:listen 每分钟执行一次
这是错误的。您应该永远不要通过 cron 调度程序调用 queue:listen
,否则您会遇到发生在您身上的意外行为。
您应该将 queue:listen 配置为永远作为守护进程运行。一旦队列工作者运行 - 它将永远运行并根据需要处理作业。您可以使用Supervisor 来确保它继续运行。
【讨论】:
谢谢,这可能是我所缺少的。我明天会尝试这样做,稍后再回来。 我有一个类似的问题,queue:listen
意外执行了schedule()
函数。你能帮助我吗。 laravel cannot run scheduled command【参考方案3】:
我认为问题在于queue:listen
命令实际上每分钟执行一次。这不应该发生。它只应在特定时刻未在侦听时执行。因此,应该检查侦听器是否正在运行。请参阅this gist,应该适合您。
要从数据库中执行所有挂起队列任务,请尝试:
php artisan queue:restart
还有:
php artisan queue:work
希望这会有所帮助。
【讨论】:
以上是关于Laravel 队列(数据库驱动程序)+ Cron 作业(任务调度程序)堆叠并且在服务器崩溃后不再发送的主要内容,如果未能解决你的问题,请参考以下文章