我在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)
的线程,但我不知道如何访问该进程对象,也不知道这是否能解决问题。
任何帮助都将不胜感激。
添加--timeout=0
对我的设置有效。
更新:因此,整个命令将是php artisan queue:listen --timeout=0
。
在投入大量时间后,我得到了解决方案
在作业类中添加下面的行,您的作业将运行而不会超时,即使您将作业放入crontab条目
public $timeout = 0;
这是Laravel v5.3中的一个已知错误:
您应该升级到v5.5来解决此问题。
另一种方法是破解源代码,如下所述
队列主要用于需要大量时间才能完成链接批量发送邮件的请求,导入数据队列作业在后台运行。它还提高了我们的web应用程序性能。如果我们不设置超时,则默认时间间隔为60秒。如果我们将超时设置为0,则意味着我们设置了无限超时,请求将持续运行,直到无法完成。要设置超时,我们必须运行以下命令:php artisan queue:listen--timeout=0
这是官方文件的参考链接:https://laravel.com/docs/8.x/queues