Php Laravel队列进程超时错误

Php Laravel队列进程超时错误,php,symfony,laravel,timeout,queue,Php,Symfony,Laravel,Timeout,Queue,我在Laravel上使用php artisan queue:listen运行排队作业。其中一项工作相当复杂,需要很长时间,因此我得到以下错误: [Symfony\Component\Process\Exception\ProcessTimedOutException]

我在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\u time\u limit(60)
,但这并没有解决我的问题

我在网上发现一个线程,上面提到了
Symfony\Component\Process\Process->setTimeout(null)
,但我不知道如何访问该进程对象,或者这是否可以解决问题

任何帮助都将不胜感激。

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

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

希望这能有所帮助。

这是Laravel v5.3中的一个已知版本:

您应该升级到v5.5以解决此问题


另一种方法是在投入大量时间获得解决方案后,对源代码进行黑客攻击

在作业类中添加以下行,作业运行时不会超时, 即使您将作业放在crontab条目中

public $timeout = 0;

队列主要是针对需要花费大量时间才能完成的请求执行的,包括批量发送邮件、后台运行的导入数据队列作业。它还提高了我们的web应用程序性能。如果我们不设置超时,默认需要60秒。时间间隔,如果我们将timeout设置为0,则表示我们设置了无限超时,请求将持续运行,直到无法完成为止。要设置超时,我们必须运行以下命令:php artisan queue:listen--timeout=0


这里是官方文档的参考链接:

您是否尝试过php artisan队列:listen--timeout=120。如果您只需要延长队列必须运行的时间,我认为没有必要重新发明轮子。如果您需要的时间超过5分钟左右,您可能需要发布处理队列作业的实际方法。如我所说,queue:listen--timeout={number}有效,但我正在运行的特定任务可能需要几秒钟到一小时或更长的时间,我不想输入一个高得离谱的超时值。是什么导致了差异?这是应用程序的结构问题。为了解决这个问题,我们需要查看代码,以便在需要解析大量数据的情况下更好地进行优化。这需要划分成更多的作业。导致问题的特定作业是在大输入上运行的O(n^2)算法。我们对输入大小进行了严格限制,以保持其合理性,但事实是,这只是一个可能需要很长时间的过程。我们使用一个作业队列在后台处理它,当它完成时,它会向我们的api发出一个http请求,指示它已经完成。有没有更好的方法来做这样的事情?将处理分为多个作业?这似乎过于复杂,因为这是一个需要在数据上运行的单一算法。我不明白为什么设置时间限制不起作用。我用另一种语言重写它,作为一个微服务,让它公开一个HTTP API并通过HTTP将数据发布到它,然后它可以在完成时通知您现有的应用程序。咕噜声或节音更合适。PHP真的不是为这种繁重的工作而设计的。对其他用户来说,旁注:将超时设置为0可能是危险的,它可能导致“不可见”的无限循环。也许可以用一些“合理”的东西,比如120。还有别的办法吗@rap-2-h点是有效的,但我的问题是,在我的脚本中,我正在做非常广泛的工作,可以运行超过24小时。“这有什么解决办法吗?”里兹:那么我得说你的设计有问题。您永远不应该依赖那些需要运行很长时间才能执行某些操作的流程。将它分解成更小的组件。谢谢,这是我正常运行xdebug所需要的。不知何故,脚本总是为我崩溃…我一直在搜索源代码和Laravel文档,但没有看到任何声明超时值为无限的内容。事实上,我们有一个问题,就是脚本在默认超时时超时,而不是无限期。有人能告诉我在源代码或文档中它在哪里支持这个理论吗?“破解源代码”从来都不是一个好主意,但是这个问题已经有三年多的历史了,并且有一个公认的答案,你的观点是什么?是的!黑客攻击源代码从来都不是一个好主意,但它比--timeout=0好。为什么黑客攻击其他人的源代码比在调用期间设置一个仅为此目的而创建的选项更好?因为--timeout=0可能会导致无限进程。这不是真正的黑客行为,它只是在v5.5中完成的升级