Ubuntu Apache2 CGI 输出缓冲

5

我在Ubuntu(11.04和12.04)上使用apache2时遇到了问题,即所有cgi输出都被缓冲直到脚本终止。如果我在Centos/rhel 6.2 apache2上运行相同的脚本,则可以正常运行。

#!/usr/bin/perl

$|=1;
print "Content-type: text/html\r\n\r\n";

print "hi..";
sleep 1;
print "hi..";
sleep 1;
print "hi..";
sleep 1;

我已经确认mod_deflate被禁用。
而且,这不仅仅是一个perl的问题,在Ubuntu和centos/rhel上编写的相同的bash cgi脚本行为也是一样的。

当Apache运行您的脚本时会发生什么? - user377628
脚本完成后,所有内容都会被打印出来,就像缓冲关闭一样。 - user1750728
3个回答

1

我在Solaris 10上遇到了类似的问题,但发现这实际上不是apache的问题,而是浏览器(firefox 15.0.1)的问题。 (我可以用telnet webserver 80进行验证,并使用纯HTML发送请求,响应显示输出确实没有被缓冲)

我可以通过同时打印一个Content-Type元标记头来解决firefox的这个问题:

print<<'_EOF_';
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
_EOF_

然而,Explorer 似乎仍在等待所有数据渲染页面,其他浏览器我没有可用的。


谢谢,我将Content type语句更改为:print "Content-type: text/html;charset=iso-8859-1\r\n\r\n";之后,它就可以在Firefox和Chrome中使用了。 - user1750728

1

Debian/Ubuntu(当然还有Solaris)的Apache软件包默认配置没有像Redhat那样指定字符集。真正的解决方案是简单地定义它。

在Ubuntu上,在/etc/apache2/httpd.conf文件中添加以下内容:

AddDefaultCharset UTF-8

如果没有这个设置,浏览器会缓存CGI脚本的输出。


非常感谢!我已经搜索了好几天,但没有找到答案。不过我还有一个问题,这似乎只适用于Firefox和IE,Chrome仍在缓冲输出,而且我尝试运行像这样的“nph”脚本,其输出仍然被缓冲。你有任何想法是什么原因吗? - tjwrona1992

0

对我来说,禁用deflate模块是有帮助的:

sudo a2dismod deflate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接