【发布时间】: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