2009-07-25 45 views
7

我希望能夠讓用戶在腳本完成時查看長時間運行的GCI腳本的輸出,而不是腳本完成後。但是,即使當我明確地清除STDOUT時,服務器似乎也會在將響應發送給客戶端之前等待腳本完成。這是在運行Apache 2.2.9的Linux服務器上。如何從Apache 2提供未緩衝的CGI內容?

例蟒蛇CGI:在Perl

#!/usr/bin/python 

import time 
import sys 


print "Content-type: text/plain" 
print 
for i in range(1, 10): 
     print i 
     sys.stdout.flush() 
     time.sleep(1) 

print "Done." 

類似的例子:

#!/usr/bin/perl 

print "Content-type: text/plain\n\n"; 

for ($i = 1; $i <= 10 ; $i++) { 
     print "$i\n"; 
     sleep(1); 
} 

print "Done."; 

此鏈接說像Apache 1.3 CGI輸出的應該是無緩衝(但這可能僅適用於Apache的1.x的):http://httpd.apache.org/docs/1.3/misc/FAQ-F.html#nph-scripts

任何想法?

+1

您也可以潛在地運行到客戶端(瀏覽器)側緩衝的問題。 – Miles 2009-07-25 04:38:50

回答

4

蘭德爾·施瓦茨的文章Watching long processes through CGI解釋看長期運行的進程的不同(恕我直言,更好)的方式。

+0

我結束了對我的應用程序使用類似的方法,但我仍然好奇爲什麼原始方法不工作在我的設置。好吧。 – 2009-09-22 14:48:25

1

CGI::Push

Apache網絡從版本服務器1.3b2 上不需要服務器推送腳本 安裝爲NPH腳本:在-NPh 參數do_push()可以被設置爲 錯誤值以禁用NPH腳本所需的額外 標頭。

你只需要在python中找到do_push等價物。

編輯:看看CherryPy: Streaming the response body

當您設置的配置條目 「response.stream」 爲True(和使用 「產量」)管理的CherryPy像這樣的HTTP服務器和你的代碼之間的對話:

alt text http://www.cherrypy.org/attachment/wiki/ReturnVsYield/cpyield.gif?format=raw

1

Flushing STDOUT可以提供幫助。例如,下面的Perl程序應該工作打算:

#!/usr/bin/perl 

use strict; 
use warnings; 

local $| = 1; 

print "Content-type: text/plain\n\n"; 

for (my $i = 1 ; $i <= 10 ; $i++) { 
    print "$i\n"; 
    sleep(1); 
} 

print "Done."; 
2

你必須把你推到腳本的特殊目錄至極含有一種特殊的.htaccess 這個environnment規格:

Options +ExecCGI 
AddHandler cgi-script .cgi .sh .pl .py 
SetEnvIfNoCase Content-Type \ 
"^multipart/form-data;" "MODSEC_NOPOSTBUFFERING=Do not buffer file uploads" 
SetEnv no-gzip dont-vary 
+0

Upvote for「setenv no-gzip」。謝謝! – 2016-05-24 01:23:02