1

经过数小时的搜索和调试,我放弃了!

有数以千计的关于长期运行的 PHP 进程的问题和文章,但没有一个能解决我的问题。

我有一个包含以下代码的 PHP 脚本:

$cur = 0; 
    // Second, loop for $timeout seconds checking if process is running 
    while( $cur < 31 ) { 
        sleep(1); 
        $cur += 1; 

       echo "\n ---- $cur ------ \n";
    }

它只是打算运行 31 秒。

我有一个 Nginx,PHP 在 debian 服务器中配置为 fastcgi。

我设置 max_execution_time = 600

/etc/php5/fpm/php.ini

我什至把它放进去

/etc/php5/cli/php.ini

还设置

request_terminate_timeout = 600

在 /etc/php5/fpm/pool.d/www.conf

我还在 nginx.conf http 部分进行了这些更改

client_header_timeout   600;
client_body_timeout     600;
send_timeout           600;

fastcgi_read_timeout    600;
fastcgi_send_timeout    600;
client_max_body_size    600;
fastcgi_buffers         8 128k;
fastcgi_buffer_size     128k;

并将指令放在服务器部分。以及 nginx 配置的 location 部分中的这些指令

send_timeout           600;

fastcgi_read_timeout    600;
fastcgi_send_timeout    600;
client_max_body_size    600;
fastcgi_buffers         8 128k;
fastcgi_buffer_size     128k;

但是我还是在浏览器中遇到Gateway Timeout错误!(是的!我重启了 php-fpm 和 nginx 数千次)

你们有什么想法吗?

4

3 回答 3

0

请不要将我的回答视为侮辱,但是,您是否确保您的网络服务器已打开并且您是否尝试访问该网站的另一个页面?

于 2017-08-12T06:12:46.053 回答
0

看到这个答案后,我倾向于认为情况如下:nginx正在尝试填充其FastCGI缓冲区(默认启用),而您的脚本返回第一个字节的时间过长,导致超时。如果我是正确的,你需要做两件事来解决这个问题:

  1. 切换fastcgi_bufferingoff
  2. 更改您的脚本,以便在每次迭代后调用flush()ob_flush()

    while( $cur < 31 ) {
        ++$cur;
        echo "\n ---- $cur ------ \n";
    
        flush();
        ob_flush();
        sleep(1);
    }
    

hth

于 2017-08-13T18:24:48.337 回答
0

我相信您需要在 Nginx 配置文件中包含该proxy_read_timeout指令。我自己的配置文件是这样的:

server {
    proxy_read_timeout 300s;
    ...
}

你会注意到那在我的服务器块中,但是这个指令在 http 和 location 块中也是有效的。

*编辑添加这是因为 Nginx代理对 PHP-FPM 服务器的请求;您尝试使用的指令仅对 Nginx 本身提供的内容有效,而不是被代理。

于 2017-08-13T18:29:50.177 回答