2010-08-09 12 views
6

Normalmente llamo a los scripts de Perl de PHP como a continuación y paso variables de esta manera, y funciona bien, sin embargo ahora estoy construyendo un componente para -use donde quiero también variablize el nombre del script de Perl que estoy pasando y esto me está dando dolores de cabeza, así que me pregunto si alguien puede señalar una mejor manera de hacerlo ya que mi manera no está funcionando ... gracias ..Llamando al script de Perl desde PHP y pasando variables, al mismo tiempo usando el nombre de script perl variablizado

la forma en que funciona sin variablized nombre de fichero perl:

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

Mi intento de variablize el nombre del archivo de perl que doe Parece que no funciona para mí, puedes ver en el anterior cómo está incluyendo incluso los $ var en la inicial "", lo cual me parece extraño, pero esta parece ser la única forma en que funciona y yo no estaba segura de cómo incluso replicar esto con un nombre de archivo perl variablized:

$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(); 

Respuesta

9

Su camino no está funcionando, ya que están concatenando todos los parámetros sin espacios, representando así un parámetro.

Trate

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

Por cierto, si los parámetros son procedentes de una fuente externa, que MUST Desinféctelos usando escapeshellarg(). Lo mismo ocurre con $perlscript - si proviene de una fuente externa o incluso de una entrada del usuario, haga un escapeshellcmd() en ella.

+0

ok gracias, eso tiene sentido .. por ahora es solo interno así que no es gran cosa sobre desinfectarlos ... gracias por el NFO – Rick

3

En su segundo código, está concatenando las variables sin espacios entre ellas. Debe considerar el uso sprintf a formatear esta muy bien:

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

En una nota, hay un paquete de CPAN que tiene como objetivo proporcionar un puente entre PHP y Perl, lo que permitirá hacer algo como lo siguiente en PHP:

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

No estoy seguro de cuán estable es esto. Ver

Si está usando Apache, se puede utilizar

// 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)); 

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

Cuestiones relacionadas