我希望能够允许用户在生成长期运行的GCI脚本时查看输出,而不是在脚本完成后查看。但是,即使我明确刷新STDOUT,服务器似乎也等待脚本完成,然后再将响应发送到客户端。这是在运行Apache 2.2.9的Linux服务器上。
示例python CGI:
#!/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."
perl中的类似示例:
#!/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
有什么想法吗?
答案 0 :(得分:4)
Randal Schwartz的文章Watching long processes through CGI解释了一种观察长时间运行过程的不同(以及恕我直言,更好)的方式。
答案 1 :(得分:2)
您必须将推送脚本放入包含特殊.htaccess的特殊目录中 有了这个环境规范:
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
答案 2 :(得分:1)
根据CGI::Push,
版本1.3b2的Apache Web服务器 on不需要服务器推送脚本 安装为NPH脚本:-nph do_push()的参数可以设置为a false值禁用额外的 NPH脚本所需的标题。
你只需要在python中找到do_push等价物。
修改:查看CherryPy: Streaming the response body。
当您将配置条目“response.stream”设置为True(并使用“yield”)时,CherryPy管理HTTP服务器与您的代码之间的对话,如下所示:
(来源:cherrypy.org)
答案 3 :(得分:1)
刷新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.";