我跑了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}
这是一个错误吗?我认为听众不应该超时!
听众的第二次跑步在3小时后超时。我用php-fgm在nginx上运行Laravel 4。
答案 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)
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,这个守护进程将重新启动它。我工作的公司一直在使用它与队列:听一会儿。