Ajax Apache 2.2 CGI perl超时,即使定期打印也会超时

Ajax Apache 2.2 CGI perl超时,即使定期打印也会超时,ajax,perl,apache,timeout,cgi,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++; } 我认为javascript丢弃输出的事实不应该对apache是否允许cg

我有一个由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++;
}

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

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


除非您禁用该功能,否则Apache将超时请求,无论cgi端是否返回了某些内容。

禁用cgi脚本超时会带来麻烦。如果调用的结果被客户机丢弃,那么您应该改为
fork
,让子代完成工作,让父代快速完成

请参阅以获取解释。具体来说,

现在是有趣的部分。我们从31号线出发。这允许父进程告诉Apache我们已经完成了对该请求的响应,同时让子进程执行长跟踪路由

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


废话,我完全忘了!谢谢,我看看这是否有用。我通常只是在打印后加上换行符,这样它就会刷新输出。这意味着整个缓冲区都被关闭了,而这仍然在发生。所以这一定是另外一回事,嗯。apache端超时也被关闭了吗?它不应该仍然允许cgi在apache配置的情况下继续吗?我认为超时只适用于脚本未打印任何内容的情况。据我所知,无论是否返回了内容,超时都适用,重要的是脚本完成执行,如果没有,则请求超时。请看一下TimeOut httpd.conf设置。并且,您是否正在关闭子级中的
STDOUT
,并在父级中立即退出?哦!关闭STDOUT似乎使它现在可以工作了。我会做更多的测试,但到目前为止我还没有得到任何超时错误。
[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