Laravel 4队列:听取时间

时间:2013-04-09 01:32:58

标签: php laravel laravel-4 symfony-components

我跑了php artisan queue:listen,大约27分钟后,它停止处理更多的工作。在我的错误日志中,我看到错误:

exception 'Symfony\Component\Process\Exception\RuntimeException' with message 'The process timed out.' in /var/www/l4site/vendor/symfony/process/Symfony/Component/Process/Process.php:413
Stack trace:
#0 /var/www/l4site/vendor/symfony/process/Symfony/Component/Process/Process.php(201): Symfony\Component\Process\Process->wait(NULL)
#1 /var/www/l4site/vendor/laravel/framework/src/Illuminate/Queue/Listener.php(63): Symfony\Component\Process\Process->run()
#2 /var/www/l4site/vendor/laravel/framework/src/Illuminate/Queue/Listener.php(50): Illuminate\Queue\Listener->runProcess(Object(Symfony\Component\Process\Process), 128)
#3 /var/www/l4site/vendor/laravel/framework/src/Illuminate/Queue/Console/ListenCommand.php(69): Illuminate\Queue\Listener->listen(NULL, 'default', 0, 128, 60)
#4 /var/www/l4site/vendor/laravel/framework/src/Illuminate/Console/Command.php(108): Illuminate\Queue\Console\ListenCommand->fire()
#5 /var/www/l4site/vendor/symfony/console/Symfony/Component/Console/Command/Command.php(240): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#6 /var/www/l4site/vendor/laravel/framework/src/Illuminate/Console/Command.php(96): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#7 /var/www/l4site/vendor/symfony/console/Symfony/Component/Console/Application.php(193): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#8 /var/www/l4site/vendor/symfony/console/Symfony/Component/Console/Application.php(106): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#9 /var/www/l4site/artisan(59): Symfony\Component\Console\Application->run()
#10 {main}

enter image description here

这是一个错误吗?我认为听众不应该超时!


更新

听众的第二次跑步在3小时后超时。我用php-fgm在nginx上运行Laravel 4。

8 个答案:

答案 0 :(得分:9)

无论你设置多长时间,它最终会耗尽内存或超时。您可以使用主管来保持其运行。使用起来非常简单。

首先安装

sudo apt-get install supervisor

或使用其网站上列出的方法,例如easy_install http://supervisord.org/installing.html

现在为主管添加配置文件。打开/etc/supervisor/conf.d/queue.conf(或任何您想要命名的文件,但将其放在/etc/supervisor/conf.d/中)并添加:

[program:queue]
command=php artisan queue:listen
directory=/var/www/laravel
stdout_logfile=/var/www/laravel/app/storage/logs/supervisor_queue_listener.log
redirect_stderr=true

上述说明:program:_____是我们如何命名运行的。我们稍后会参考。 command是您要运行的命令。 directory是应该运行的地方。在我的情况下,我在一个名为“laravel”的项目中。 stdout_logfile是您要重定向从命令接收的stdout的文件。 redirect_stderr设置为true可将所有错误定向到stdout_logfile指定的同一日志,您也可以将这些错误设置为自己的日志文件。

打开主管控制器

sudo supervisorctl

阅读/etc/supervisor/conf.d/ 目录的内容:(仍然在supervisorctrl中)

reread

将队列程序添加到主管

add queue

就是这样。现在它应该运行。如果您在日志文件中查找错误以查看错误。

重新启动服务器后,您必须再次使用sudo service supervisor start启动主管。

Laracasts covers Supervisor非常好。如果您没有订阅Laracasts,我强烈推荐它。

答案 1 :(得分:5)

Laravel 4中的

queue:listen有一个--timeout选项。如果您想要无限制超时,则应将--timeout选项设置为0。

./artisan queue:listen --timeout=0

答案 2 :(得分:3)

只需运行COMPOSER_PROCESS_TIMEOUT = 4000 php artisan queue:listen

答案 3 :(得分:1)

也不是工匠要么超时了。它的进程包装器。 Symfony \ Component \ Process \ Process Class用于运行任何进程(在我的情况下,Knp \ Bundle \ SnappyBundle \ Snappy \ LoggableGenerator打印带有wkhtmltoPDF的PDF的包正在考虑wkhtmltoPDF因为我正在渲染PDF而超时11000页,只需要更多时间)

它与php.ini的max_execution_time = XXX无关(因为它是Symfony Process实例抛出的异常,带有令人困惑的消息)

你必须设法通过对象关系来调用

Symfony\Component\Process\Process->setTimeout(null) 

这解决了问题。就我而言:

    $knp = $this->getContainer()->get('knp_snappy.pdf');
    /* @var $knp \Knp\Bundle\SnappyBundle\Snappy\LoggableGenerator */
    $knp->getInternalGenerator()->setTimeout(null);
    $pdf = $knp->getOutputFromHtml($this->view, $printOptions);

答案 4 :(得分:0)

问题是有时间限制。
改变时限,解决问题 参数或者set_time_limit(howmanysecondsyouneed)
http://php.net/manual/en/function.set-time-limit.php

答案 5 :(得分:0)

我不认为听众超时,我认为它试图运行的过程是超时的。该例外来自Symfony\Component\Process。不幸的是,过程代码本身对我来说有点过头了。

答案 6 :(得分:0)

以下命令就像魅力一样。它现在已经过夜了(超过12小时)。

php artisan queue:listen --timeout=0

感谢timgws回答。

答案 7 :(得分:0)

您是否考虑过使用supervisord来确保您的流程继续运行。如果您的进程因任何原因而死亡,安装了supervisord,这个守护进程将重新启动它。我工作的公司一直在使用它与队列:听一会儿。