mod_perl调用外部程序并将输出显示在浏览器

mod_perl调用外部程序并将输出显示在浏览器

mod_perl调用外部程序并将输出显示在浏览器
今日,向fayland,joe,黄叶等人请教了关于在mod_perl下,如何实现不缓存输出.当时大家都认为是用$| = 1;$r->print
当时在这个问题上我提的并不是很好,其实我是想了解在mod_perl中用system调用的外部程序的输出在mod_perl中如何实时显示到浏览器中.
当时我的程序因为要运行比较长时间,所以我错误地认为是所有输出因为buffer的原因,一直没有输出.后来回家后再测试了一下,发现在mod_perl下的system根本就没有任何输出到浏览器,但在CGI MODE下则有.于是仔细翻查了mod_perl的文档,发现如下内容:
默认情况下[color=red]system[/color], [color=red]exec[/color]这些调用执行的外部程序向STDOUT的输出并不会显示在浏览器.所以mod_perl提供了相应模块进行处理.
在mp1的时候,是Apache::SubProcess,重载了system, exec这些函数,不过,这个我没有试过能不能的.
下面说说mp2的,因为我现在用的是mp2
在mp2 的时候,是Apache2::SubProcess,下面例程出自:http: //perl.apache.org/docs/2.0/api/Apache2/SubProcess.html,但我作了小小修改,因为我只需要捕获其输出,并不需要向其写入任何信息.
[quote]
use Apache2::SubProcess ();

use Config;
use constant PERLIO_IS_ENABLED => $Config{useperlio};

$r = shift;

# pass @ARGV / read from the process
$command = "/tmp/argv.pl";
@argv = qw(foo bar);
$out_fh = $r->spawn_proc_prog($command, \@argv);
$output = read_data($out_fh);

# pass environment / read from the process
$command = "/tmp/env.pl";
$r->subprocess_env->set(foo => "bar");
$out_fh = $r->spawn_proc_prog($command);
$output = read_data($out_fh);

# helper function to work w/ and w/o perlio-enabled Perl
sub read_data {
my ($fh) = @_;
my $data;
if (PERLIO_IS_ENABLED || IO::Select->new($fh)->can_read(10)) {
$data = <$fh>;
}
return defined $data ? $data : '';
}
[/quote]

如果再利用$| = 1;与$r->print,则可以实时向浏览器输出信息了...在$| = 1的时候print还是buffer IO来的.
如果有更好的方法希望各位.
如果有更好的方法希望各位分享一下了.
不缓存看起来还有另一个条.
不缓存看起来还有另一个条件,就是要html格式的,用plain的不行.
拜读此贴,但是还有很多疑.
拜读此贴,但是还有很多疑问,我PM楼主
我的邮箱: liuyitelent@hotmail.com
希望得到楼主的帮助和早日回复,谢谢!!