Apache 2.2 CGI perl超时,即使是定期打印也仍然超时

时间:2010-08-11 00:05:08

标签: ajax perl apache timeout cgi

我有一个由AJAX从客户端javascript调用的cgi代码。但是,客户端会丢弃呼叫结果。

在后端,此代码出现:

$|=1;
my $i = 0;
while (<$fh_echo>)
{
    #To prevent apache timing out the cgi script. 
    print "." if $i % 100 == 0;

    #Do stuff
    $i++;
}

尽管定期打印出来,但仍然超时:

[warn] [client 10.23.12.87] Timeout waiting for output from CGI script 
[error] [client 10.23.12.87] (70007)The timeout specified has expired: ap_content_length_filter: apr_bucket_read() failed

我认为javascript丢弃输出的事实不应该对apache是​​否允许cgi脚本继续产生任何形式的影响。如果是的话,那么这里发生了什么?

2 个答案:

答案 0 :(得分:2)

禁用CGI脚本的超时是一个问题。鉴于客户放弃了调用的结果,您应该fork,让孩子完成工作,父母快速完成。

有关说明,请参阅Watching long processes through CGI。具体地,

  

现在是有趣的部分。我们将从第31行开始分叉。这允许父进程告诉Apache我们已经完成了对此请求的响应,同时让子进程执行长traceroute。 ...

     

孩子继续,但必须首先关闭STDOUT,否则Apache会认为浏览器可能仍会有一些输出,并且在完全解决之前不会响应浏览器或释放连接。

答案 1 :(得分:1)

Perl缓冲输出,请确保$|设置为非零值。

除非您禁用functionality,否则Apache将超时请求,无论是否返回了cgi端的内容。