【问题标题】:Laravel queue process timeout errorLaravel 队列进程超时错误
【发布时间】:2014-11-10 17:35:43
【问题描述】:

我在 Laravel 上使用 php artisan queue:listen 运行排队的作业。其中一项工作涉及相当多并且需要很长时间,因此我收到以下错误:

[Symfony\Component\Process\Exception\ProcessTimedOutException]                                                                                                                                                                              
The process ""/usr/local/Cellar/php55/5.5.14/bin/php" artisan queue:work  
--queue="QUEUE_URL" --delay=0 --memory=128 --sleep=3 --tries=0" 
exceeded the timeout of 60 seconds.

我知道我可以使用任意高的超时值运行queue:listen,但这并不理想,因为我确实希望它在某些进程实际上是的情况下超时 反应迟钝。我尝试在作业调用的函数中定期调用set_time_limit(60),但这并没有解决我的问题。

我在网上找到了一个帖子提到Symfony\Component\Process\Process->setTimeout(null),但我不知道如何访问该进程对象,或者这是否能解决问题。

任何帮助将不胜感激。

【问题讨论】:

  • 你试过 php artisan queue:listen --timeout=120.如果您只需要延长队列必须运行的时间,我认为没有必要重新发明轮子。如果您需要超过 5 分钟左右的时间,尽管您可能需要发布处理队列作业的实际方法。
  • 就像我说的,queue:listen --timeout={number} 有效,但我正在运行的特定任务可能需要几秒钟到一个小时或更长时间,而我不会想要设置一个高得离谱的超时值。
  • 造成差异的原因是什么?这是您的应用程序结构的问题。为了帮助解决这个问题,我们需要查看代码,以便我们可以更好地优化您必须解析大量数据的情况。这需要分成更多的工作。
  • 导致问题的特定作业是在大输入上运行的 O(n^2) 算法。我们对输入大小施加了硬性限制以使其保持合理,但事实是这只是一个可能需要很长时间的过程。我们在后台使用作业队列来处理它,当它完成时,它会向我们的 api 发出一个 http 请求以表明它已经完成。有没有更好的方法来做这样的事情?将处理分成许多工作?这似乎过于复杂,因为它是需要在数据上运行的单一算法。我不明白为什么 set_time_limit 不起作用。
  • Id 用另一种语言重写它,作为一个微服务,让它公开一个 HTTP API 并通过 HTTP 将数据发布到它,然后它可以在完成时通知您现有的应用程序。 Golang 或 Node 听起来更合适。 PHP 真的不适合那种繁重的工作。

标签: php symfony laravel timeout queue


【解决方案1】:

添加 --timeout=0 对我的设置有用。

更新: 因此,整个命令将是 php artisan queue:listen --timeout=0

希望这会有所帮助。

【讨论】:

  • 其他用户的旁注:将超时设置为 0 可能很危险,它可能导致“隐形”无限循环。也许使用像 120 这样“合理”的东西。
  • 还有其他方法吗? @rap-2-h 点是有效的,但我的问题是,在我的脚本中,我正在做非常广泛的工作,可以运行超过 24 小时。任何解决方案。
  • @Rizh 那么我会说你的设计有问题。你永远不应该依赖那些需要运行这么长时间才能做某事的进程。将其分解为更小的组件。
  • 谢谢,这是我正常运行 xdebug 所需要的。不知何故,脚本总是为我崩溃......
  • 我一直在搜索源代码和 Laravel 文档,但没有看到任何说明超时的 0 值是无限的。实际上,我们确实遇到了一个问题,并且脚本在默认超时时超时并且没有达到无限。谁能指出我在源代码或文档中支持这一理论的地方? laravel.com/docs/8.x/queues#timeout
【解决方案2】:

投入大量时间后,我得到了解决方案

在 Job 类中添加以下行,您的作业将在没有超时的情况下运行, 即使您将作业放在 crontab 条目中

public $timeout = 0;

【讨论】:

    【解决方案3】:

    这是 Laravel v5.3 中已知的 bug

    您应该升级到 v5.5 来解决这个问题。

    另一种方法是破解源代码here

    【讨论】:

    • “破解源代码”从来都不是一个好主意,但由于这个问题已有三年多的历史并且有一个公认的答案,你的意思是什么?
    • 是的!破解源代码从来都不是一个好主意,但它比 --timeout=0 更好
    • 为什么破解其他人的源代码比在通话期间设置一个专门为此目的创建的选项更好?
    • 因为 --timeout=0 可能会导致一个无穷大的进程。这并不是真正的黑客攻击,它只是在 v5.5 中完成的升级
    【解决方案4】:

    队列主要针对需要大量时间才能完成的请求链接批量发送邮件,导入数据队列作业在后台运行。它也提高了我们的网络应用性能。如果我们不设置超时,则默认为 60 秒。时间间隔,如果我们将超时设置为 0,这意味着我们设置了无限超时,请求会持续运行直到它无法完成。要设置超时,我们必须运行以下命令: php artisan queue:listen --timeout=0

    这里是官方文档的参考链接:https://laravel.com/docs/8.x/queues

    【讨论】:

    • 文档没有提到 60s 作为默认超时,但在示例中提到了 60。他们的意思是暗示这是默认设置吗?
    猜你喜欢
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多