【发布时间】:2019-03-20 01:03:52
【问题描述】:
我在两个不同的服务器 Centos 和 Debian 上有以下 perl 脚本,它们都运行 Apache Web 服务器:
$|++;
print "Content-type: text/plain\n\n";
for ($i=1; $i<=10;$i++) {
print "$i\n";
sleep(1);
}
print "Done.\n";
在使用 Apache/2.2.3 和 perl v5.8.8 输出刷新的 centos 上工作正常,我可以在浏览器中看到计数器的进程。
在 Debian Apache/2.4.10 和 perl v5.20.2 输出刷新不起作用,我在 10 秒后才能在浏览器中看到整个页面。
有没有办法配置 apache 以便像在 centos 上一样刷新输出?
【问题讨论】:
-
尝试使用
select->autoflush(1),而不是依赖之前设置的魔法值。 -
@choroba,这是一个风格建议吗?因为这不会产生任何功能差异。 (如果你想避免
$|++;的魔力,你只需要$| = 1;。显然,select->autoflush(1);更清晰,但代价更高,因为它涉及对select的三个调用和对@ 的两个分配987654327@.) -
Re "有没有办法配置 apache",我确认这不是 Perl 的差异造成的。
-
请注意,
use IO::Handle ();需要autoflush才能在 5.8.8 中作为句柄上的方法调用。我的偏好是\*STDOUT->autoflush(1);,只要你知道你正在处理 STDOUT,但你是对的,它不应该产生功能上的差异。 -
选择->autoflush(1);或 *STDOUT->autoflush(1);没有效果;我认为这是一个 apache 设置而不是 perl 的区别。