如何从Apache 2提供无缓冲的CGI内容?

时间:2009-07-25 03:42:05

标签: python perl apache2 cgi

我希望能够允许用户在生成长期运行的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

有什么想法吗?

4 个答案:

答案 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服务器与您的代码之间的对话,如下所示:

alt text
(来源: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.";