【问题标题】:How to prevent Laravel queue job, schedule and cron job from killing the server如何防止 Laravel 队列作业、调度和 cron 作业杀死服务器
【发布时间】:2018-09-23 11:30:06
【问题描述】:

我认为我的问题更多是回退,现在我的 Laravel 作业队列中有两个队列作业,并且我正在使用数据库驱动程序。第一个命令基于 API 调用从另一个站点为我的用户创建凭据,第二个命令是通过电子邮件发送验证和 2FA。此外,还有另一个命令可以更新更改我的单位转换率。

protected function schedule(Schedule $schedule){
$schedule->command('update:conversionRate')->everyFiveMinutes();
$schedule->command('queue:work')->everyMinute(); 
} 

使用 dispatch 命令和 shouldQueue 接口将队列作业添加到我的队列中,API 调用使用 dispatch 函数,而电子邮件使用 shouldQueue。

现在它可以工作了,因为我可以在我的数据库中看到作业。但是当服务器 cron 作业运行时它会崩溃,并且我的日志文件显示我的 MySQL 用户已达到最大连接限制。因此,没有人可以使用该用户帐户评估数据库。

所以我的问题是如何设置 cron 作业和 queue:work 使其不会导致服务器崩溃?

【问题讨论】:

  • 您以错误的方式使用队列。一旦队列工作(队列:工作),您无需执行即可使其再次工作。使用 beanstalkd 确保您的队列始终运行。
  • 请阅读Under what circumstances may I add “urgent” or other similar phrases to my question, in order to obtain faster answers? - 总结是这不是解决志愿者的理想方式,并且可能会适得其反。请不要将此添加到您的问题中。
  • 您需要找出达到连接限制的原因。 cron 作业的单个实例需要多少个连接?您是在运行一个循环,然后在循环内打开连接,而不是在循环外打开一个连接吗?

标签: php laravel cron


【解决方案1】:

我如何理解您与数据库的最大连接数有关的问题。

第一种解决方案,但最好不要增加对数据库的连接限制。

第二种解决方案是使用队列。您没有尝试使用驱动程序而不是数据库,例如 redis 或 beanstalkd?

您还每分钟运行一次命令。将 cron 作业用于队列是一种不好的做法。有一个监督者。

另外,与团队一起,尝试使用队列:工作参数。

示例

php artisan queue:work --sleep=3 --tries=3 --daemon

--sleep 这个handler在处理队列的元素之间会有一个break

--tries = 3 如果由于某种原因该项目不会被处理,在此参数之后它将尝试3次并继续下一个元素,默认情况下它会尝试多次尝试。

尝试这些选项。

【讨论】:

  • 我问我的服务器是否可以安装主管。答案是否定的,因为它是共享主机。
  • @AdajOEL 你不需要每分钟都跑。运行一次此命令
猜你喜欢
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 2017-10-11
  • 2021-08-06
  • 2018-07-15
  • 1970-01-01
相关资源
最近更新 更多