我可以在 Laravel 中处理作业超时吗?

Posted

技术标签:

【中文标题】我可以在 Laravel 中处理作业超时吗?【英文标题】:Can I handle jobs timeout in Laravel? 【发布时间】:2018-07-19 05:44:12 【问题描述】:

我正在使用 Laravel 5.5,并且我有一些使用 IMAP 检查电子邮件的工作。有时这可能需要很长时间,或者说用户错误的端口或用户名,IMAP 服务器需要很长时间才能响应。所以我想出了一个想法,我可以将我的工作限制在某个时期,但是当那个时期到期时,不仅我的工作不会转移到失败的工作上,而且我的工人也会被杀死。我错过了什么?有没有其他方法可以做到这一点?如果作业到期,我想在数据库中进行一些更改。任何想法? 提前谢谢你

【问题讨论】:

【参考方案1】:

首先,您需要使用 Supervisor 管理您的员工。如果它们被杀死,主管将重新启动它们。https://laravel.com/docs/5.5/queues#supervisor-configuration

之后,您需要阅读 Laravel 文档中有关作业过期和超时的信息。https://laravel.com/docs/5.5/queues#job-expirations-and-timeouts

要解决您的问题,您需要增加工作人员的--timeout。您可以尝试 3600 秒。您还需要增加作业到期时间(config/queues.php 队列中的retry_after 值)。尝试 3550 秒。 (如果您的 --timeout 选项比您的 retry_after 配置值长,您的作业可能会被处理两次。)如果您发现问题再次出现,您可以增加超时值。

如果您发现问题并且不要等待 3550 秒来释放作业和工作人员,那么您的代码必须具有 try/catch 来捕获异常以退出,这一点非常重要。

【讨论】:

你现在如何使用 docker 在启动时启动主管? 对不起,我不使用 docker。

以上是关于我可以在 Laravel 中处理作业超时吗?的主要内容,如果未能解决你的问题,请参考以下文章

我如何扩展laravel转换器(任何其他组件)?

身份验证登录时的 Laravel 超时

使用Supervisor来管理你的Laravel队列

laravel中的双向WebSockets?

如何在 redis 上的 laravel 队列中获取所有待处理的作业?

Laravel 中的 Cron 作业 [重复]