2010-08-09 17 views
6

Zwykle nazywam skrypty perl z PHP jak poniżej i przekazuję zmienne w ten sposób, i działa dobrze, jednak teraz buduję komponent do ponownego -użytek, w którym chcę również zmienić nazwę skryptu Perl, przez który przechodzę, i to daje mi pewne bóle głowy, więc zastanawiam się, czy ktoś może wskazać lepszy sposób na zrobienie tego, ponieważ mój sposób nie działa ... dzięki ..Wywołanie skryptu Perl z PHP i przekazywanie zmiennych, przy jednoczesnym użyciu zmiennej nazwy skryptu Perl

sposób, który działa bez variablized perl Nazwa pliku:

$file = "/var/www/other_scripts/perl/apps/perlscript.pl $var1 $var2 $var3 $var4"; 
ob_start(); 
passthru($file); 
$perlreturn = ob_get_contents(); 
ob_end_clean(); 

Moja próba variablize nazwę pliku perl że Doe Wydaje mi się, że działasz dla mnie, możesz zobaczyć w powyższym przykładzie, że zawiera on nawet $ var (y) w początkowym "", co wydaje mi się dziwne, ale wydaje mi się, że to jedyny sposób, w jaki działa i ja nie był pewien, jak to nawet replikować z variablized perl pliku:

$perlscript_file = "/var/www/other_scripts/perl/apps/" . $perlscript .".pl"; 

$file = $perlscript_file . $var1 . $var2 .$var3 . $var4; 
ob_start(); 
passthru($file); 
$perlreturn = ob_get_contents(); 
ob_end_clean(); 

Odpowiedz

9

Twój sposób nie działa, ponieważ jesteś łącząc wszystkie parametry bez spacji, skutecznie czyniąc z nich jeden parametr.

Spróbuj

$perlscript_file = "/var/www/other_scripts/perl/apps/$perlscript.pl $var1 $var2 $var3 $var4"; 

Nawiasem mówiąc, jeśli parametry są pochodzące z zewnętrznego źródła, to MUST zdezynfekować je za pomocą escapeshellarg(). To samo dotyczy $perlscript - jeśli pochodzi z zewnętrznego źródła lub nawet z wejścia użytkownika, zrób na nim escapeshellcmd().

+0

ok dzięki, że ma sens .. teraz jest po prostu wewnętrzna, więc nie jest to wielka sprawa w zakresie ich odkażania .. dzięki za to nfo – Rick

3

W drugim kodzie łączymy zmienne bez spacji między nimi. należy rozważyć użycie sprintf formatować to ładnie:

$script = sprintf('/var/www/other_scripts/perl/apps/%s.pl %s %s %s %s', $perlscript, $var1, $var2, $var3, $var4); 
6

Na sidenote, istnieje pakiet CPAN, który ma na celu stworzenie pomostu pomiędzy PHP i Perl, który pozwoli Ci zrobić coś jak następuje w PHP:

$perl = Perl::getInstance(); 
$instance = $perl->new('perlclass', @args); 

Nie wiem, jak stabilne jest to jednak. Zobacz

Jeśli używasz Apache, można również użyć

// PHP 
apache_note('foo', 'bar'); 
virtual("/perl/some_script.pl"); 
$result = apache_note("resultdata"); 

# Perl 
my $r = Apache->request()->main(); 
my $foo = $r->notes('foo'); 
$r->notes('resultdata', somethingWithFoo($foo)); 

zobaczyć http://php.net/manual/en/function.apache-note.php

Powiązane problemy