Вызов скрипта Perl из PHP и передача переменных, а также использование изменяемого имени скрипта perl - PullRequest
6 голосов
/ 09 августа 2010

Обычно я вызываю сценарии Perl из PHP, как показано ниже, и передаю переменные таким образом, и это работает нормально, однако сейчас я создаю компонент для повторного использования, где я также хочу изменить переменную имени сценария Perl, который я передаю и это вызывает у меня некоторые головные боли, поэтому мне интересно, если кто-нибудь может указать лучший способ сделать это, так как мой путь не работает .. спасибо ..

способ, который работает без изменяемого имени файла 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();

Моя попытка изменить имя файла perl, который, кажется, не работает для меня, вы можете увидеть выше, как он включает в себя даже $ var (s) в начальном "", что я нахожу странным, но это Кажется, это единственный способ, которым он работает, и я не был уверен, как даже воспроизвести это с изменяемым именем файла perl:

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

Ответы [ 3 ]

9 голосов
/ 09 августа 2010

Ваш путь не работает, потому что вы объединяете все параметры без пробелов, фактически превращая их в один параметр.

Попробуйте

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

Кстати, если параметры поступают извнешний источник, вы ДОЛЖНЫ санировать их, используя escapeshellarg().То же самое касается $perlscript - если он поступает из внешнего источника или даже из пользовательского ввода, выполните escapeshellcmd() для него.

6 голосов
/ 09 августа 2010

В sidenote есть пакет CPAN, целью которого является обеспечение моста между PHP и Perl, который позволит вам сделать что-то вроде следующего в PHP:

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

Не уверен, насколько это стабильно. См

Если вы используете Apache, вы также можете использовать

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

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

3 голосов
/ 09 августа 2010

Во втором коде вы объединяете переменные без пробелов между ними.Вам следует рассмотреть возможность использования sprintf для удобного форматирования:

$script = sprintf('/var/www/other_scripts/perl/apps/%s.pl %s %s %s %s', $perlscript, $var1, $var2, $var3, $var4);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...