2010-08-11 63 views
1

我有一個cgi代碼,正在通過AJAX從客戶端javascript調用。但是,該呼叫的結果被客戶端丟棄。Apache 2.2 CGI perl超時,即使定期打印仍然超時

在後端出現此代碼:

$|=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

禁用CGI腳本的超時時間需要麻煩。鑑於呼叫的結果被客戶拋棄,您應該改爲讓孩子完成工作,並快速完成母公司的工作。

有關說明,請參見Watching long processes through CGI。具體而言,

現在有趣的部分。我們將從第31行開始分叉。這允許父進程告訴Apache我們已經完成了對此請求的響應,同時讓子進程執行長路由跟蹤。 &hellip;

小孩繼續說下去,但它必須先關閉STDOUT,否則Apache會認爲瀏覽器可能仍會有一些輸出,並且在完全解決之前不會響應瀏覽器或釋放連接。

+0

這是一個分叉過程。 – 2010-08-11 05:06:31

+0

而且,你是否正在關閉子女中的'STDOUT'並立即退出父母? – 2010-08-11 05:32:03

+0

哦!關閉STDOUT似乎使它現在工作。我會做更多的測試,但到目前爲止,我還沒有得到任何時間錯誤。 – 2010-08-11 17:33:06

1

Perl緩衝區輸出,請確保$|設置爲非零值。

Apache將超時請求,除非您禁用functionality,無論cgi端是否有返回的內容。

+0

廢話我完全忘了!謝謝,我會看看這是否有幫助。我通常只是在打印後放置換行符,以便刷新輸出。 – 2010-08-11 00:17:47

+0

只看到$ |在我的代碼開始時被設置爲1。這意味着整個時間緩衝區WAS關閉,並且這仍然在發生。所以它一定是別的東西。 – 2010-08-11 00:20:46

+0

是否關閉了apache端暫停? – szbalint 2010-08-11 00:23:12