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 作业(任务调度程序)堆叠并且在服务器崩溃后不再发送的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.6队列重启CPU使用率

Laravel Lumen 队列失败与队列:工作但不是队列:听

Laravel 5.1 中的随机 cron 作业

Xdebug laravel artisan 命令

Laravel 调度程序自定义 Cron 表达式不起作用

使用消息队列与使用 PHP 的普通 Cron 作业之间的区别