如何从Perl CGI脚本中不断通知用户进度?

Jib*_*ran 5 apache perl cgi

我有这个Perl脚本位于我的Apache服务器的cgi-bin文件夹中:

#!/usr/bin/perl 
use strict;
use warnings;

$| = 1;

print "Content-type: text/html\r\n\r\n";
print "Hello there!<br />\nJust testing .<br />\n";

my $top = 5;
foreach (1..$top) {
    print "i = $_<br />\n";
    sleep 1;
}
Run Code Online (Sandbox Code Playgroud)

我想在这里实现的是逐步更新网页以向用户显示更新状态.然而,我实际上得到的是在延迟5秒之后的整个输出.

有什么办法可以编写一个能够不断告知用户进度的脚本吗?我有一个脚本需要很长时间才能完成,我希望能够实时看到它的进度而不是完整的脚本.

我也尝试将autoflush模式设置为off($ | = 0),但即便如此也没有做任何事情.

Sin*_*nür 5

Randal Schwartz 通过CGI展示了观察长流程的更好方法.

也就是说,说谎内容类型无济于事.以下脚本完全按照您希望它在使用Apache 2.2的Windows XP上执行的操作(因为最后一行输出需要十秒钟):

#!/usr/bin/perl

use strict;
use warnings;

use CGI qw(:cgi);

print header('text/plain');

$| = 1;

print "Job started\n";

for ( 1 .. 10 ) {
    print "$_\n";
    sleep 1;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果您要发送HTML,您无法避免这样的事实,即大多数浏览器会等到他们认为足够的页面才能开始呈现.