Greetings,
I have moved a big collection of modules to mod_perl2 under PerlRun
and can see a great speedup, as hoped. But in some of these modules
programs are run that write something to STDOUT that is then captured
and processed - which doesnt work since STDOUT is tie'ed to Apache.
I saw suggestions to use the $r-> interface, but I prefer to not be
mod_perl specific (write handlers or use the request object etc), at
least not until later. So to "borrow" STDOUT temporarily I did the
attempt below (found in Stas Bekmans 1.0 practical mod_perl), which
opens a temporary STDOUT into a string. Printing to STDOUT works as
hoped, but output from other programs run by system do not appear
in $out_str; instead they appear - most of the time, sometimes not -
in the console where Apache was started (with httpd -X). I can put
the command line to run in backticks and do print [EMAIL PROTECTED], and
that too works, but would like to use system, Proc::SafeExec, etc.
I use Apache 2.2.9, mod_perl 2.0.4 and Linux. Below the example is
the mod_perl part of httpd.conf.
Any ideas? (I'm sure its something obvious i missed, but it has
become an obstacle for me)
Niels L
------------------------------ test.cgi
<pre>
#!/usr/bin/env perl
use strict;
use warnings FATAL => qw ( all );
use Symbol;
my ( $out_fh, $out_str );
{
$out_str = "";
$out_fh = Symbol::gensym();
open $out_fh, '>', \$out_str or die "Can't open stdout to string: $!";
$| = 1;
local *STDOUT = $out_fh;
# Print always puts output into always goes into $out_str,
print "hello\n";
# But commands like date, ls etc goes into $out_str sometimes,
# sometimes at console where apache was started with httpd -X
# system( "date" );
# print `date`; # works
close $out_fh;
}
#print "Content-type: text/html\n\n";
print "<pre>\n";
print $out_str;
print "</pre>\n";
print $ENV{"MOD_PERL"} ."<br>";
print $ENV{"GATEWAY_INTERFACE"} ."<br>";
print $ENV{"SERVER_PROTOCOL"} ."<br>";
</pre>
--------------- httpd.conf
SetEnv TERM "dumb"
PerlSetEnv TERM "dumb"
LoadModule perl_module modules/mod_perl.so
PerlModule ModPerl::PerlRun
<LocationMatch "/test.cgi">
SetHandler perl-script
PerlResponseHandler ModPerl::PerlRun
Options SymLinksifOwnerMatch ExecCGI
</LocationMatch>