mod_perl: %ENV a system()

Honza Pazdziora adelton na fi.muni.cz
Čtvrtek Srpen 11 22:15:02 MEST 2005


On Thu, Aug 11, 2005 at 06:03:25PM +0200, Jan Kasprzak wrote:
> 
> 	mam problem s prechodem na mod_perl2 - vypada to, ze
> ackoli (po PerlOptions SetupEnv) mam v %ENV vsechno co ocekavam,
> nedari se mi to predat novemu procesu, ktery spustim treba
> pres rouru v open() nebo pres system():
> 
> 	Priklad kodu:
> 
> -------------------------------------------------------
> #!/usr/bin/perl -w
> my $q = new CGI;
> 
> print "Content-Type: text/plain\n\n";
> 
> print "My ENV =================\n";
> for (sort keys %ENV) {
>         print $_, " => '", $ENV{$_}, "'\n";
> }
> 
> system "/bin/bash -c set >/tmp/set";
> 
> print "\nPassed ENV==============\n";
> open (PIPE, "/bin/bash -c set|");
> print <PIPE>;
> close PIPE;
> print "========================\n";
> -------------------------------------------------------
> 
> 	Pod "My ENV" mam co ocekavam (vcetne veci jako QUERY_STRING
> a dalsi, pod "Passed ENV" a v /tmp/set mam jen par internich veci
> shellu. Ale je zajimave, ze ruzne veci ktere jsem exportoval
> predtim (LD_LIBRARY_PATH, ORACLE_HOME, atd.) jsou predany korektne.
> Nepredavaji se jen interni veci Apache. Jak tohle muzu predat,
> pokud chci, aby potomek volany pres open() nebo system() dostal
> take QUERY_STRING a dalsi CGI promenne?

Podle

	http://perl.apache.org/docs/2.0/user/troubleshooting/troubleshooting.html#C_Libraries_Don_t_See_C__ENV__Entries_Set_by_Perl_Code

bych si tipnul, ze pouzivas perl-script a ne modperl. Takze size je
nastavene %ENV, ale ne to, co se predava dalsimu procesu.

V takovem pripade je potreba to do tono environ[] explicitne dostat.
Dokumentace, ktera Te zajima, ze

	http://perl.apache.org/docs/2.0/api/Apache2/SubProcess.html#C_spawn_proc_prog_
	http://perl.apache.org/docs/2.0/api/Apache2/RequestRec.html#C_subprocess_env_

Se system() jsem problemy nemel, s open (a open2 a open3) ano, ty
filehandly se chovaly divne, takze tam bylo nejrozumnejsi si ten
spawn_proc_prog necim obalit (pokud by to chtel clovek pouzivat
jak z CGI, tak z mod_perl2) a misto open / open2 volat takovy
wrapper, ktery pro mod_perlove prostredi prislusne polozky z %ENV
nastavi (treba pomoci Env::C).

Doufam, ze odpovidam alespon castecne na to, na co se ptas.

-- 
------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
 .project: Perl, mod_perl, DBI, Oracle, large Web systems, XML/XSL, ...
		Only self-confident people can be simple.


Další informace o konferenci Perl