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

我有一个cgi代码,正在从客户端JavaScript AJAX调用。 然而,呼叫的结果被客户丢弃。

在后端发生这个代码:

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

尽pipe定期打印,这仍然超时

 [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 

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

禁用CGI脚本的超时时间是很麻烦的。 鉴于调用的结果被客户抛弃,您应该改为fork ,让孩子快速完成工作并完成父项。

请参阅通过CGI观察长进程以获取解释。 特别,

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

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

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

Apache会超时请求,除非你禁用了这个功能 ,不管有没有从cgi端返回的东西。