使用nginx和php-fpm防止超时

时间:2013-04-16 07:30:08

标签: php apache nginx laravel laravel-4

我在运行Job Queue侦听器时遇到超时(无限循环)。监听器调用一个工作者,其功能涉及使用shell_exec()执行软件PhantomJS。

我使用php5-fpm和PHP框架Laravel 4(使用symfony组件)运行nginx 1.2.7。

问题:运行一段时间后,侦听器将退出错误The process timed out。我怀疑是由于shell_exec()需要很长时间才能返回结果。

enter image description here

尝试:我尝试将nginx上的超时设置增加到600秒,但这没有用。 set_time_limit(0)也无济于事。

如何防止超时,或者至少防止超时错误导致队列侦听器被杀?

启用位点-/ mysite.com

server {
    listen   80;
    server_name www.mysite.com mysite.com *.mysite.com;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    root /var/www/mysite/public;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$args ;
    }
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_read_timeout 600;
        fastcgi_send_timeout 600;
        client_body_timeout 600;
        send_timeout 600;
        proxy_read_timeout 600;
    }

}

错误堆栈跟踪

exception 'Symfony\Component\Process\Exception\RuntimeException' with message 'The process timed out.' in /var/www/mysite/vendor/symfony/process/Symfony/Component/Process/Process.php:413
Stack trace:
#0 /var/www/mysite/vendor/symfony/process/Symfony/Component/Process/Process.php(201): Symfony\Component\Process\Process->wait(NULL)
#1 /var/www/mysite/vendor/laravel/framework/src/Illuminate/Queue/Listener.php(63): Symfony\Component\Process\Process->run()
#2 /var/www/mysite/vendor/laravel/framework/src/Illuminate/Queue/Listener.php(50): Illuminate\Queue\Listener->runProcess(Object(Symfony\Component\Process\Process), 128)
#3 /var/www/mysite/vendor/laravel/framework/src/Illuminate/Queue/Console/ListenCommand.php(69): Illuminate\Queue\Listener->listen(NULL, 'default', 0, 128, 60)
#4 /var/www/mysite/vendor/laravel/framework/src/Illuminate/Console/Command.php(108): Illuminate\Queue\Console\ListenCommand->fire()
#5 /var/www/mysite/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/mysite/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/mysite/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/mysite/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/mysite/artisan(59): Symfony\Component\Console\Application->run()
#10 {main}

更新

使用Apache 2.2.22和默认设置时仍会出现超时。任何想法可以改变哪些设置以避免超时?

2 个答案:

答案 0 :(得分:0)

检查#3。该函数调用有一个非常可疑的60作为参数。你确定它是你的命中限制,还是那里的代码监听控制台输出最多60秒?

答案 1 :(得分:0)

一旦listen进程占用太多内存,它就会自行消失。

if ($this->memoryExceeded($memory))
{
    $this->stop(); return;
}

我听说你应该使用Supervisor来确保重新启动进程并始终运行。我不知道为什么你必须这样做/:并且还没有尝试过。