从PHP调用Perl脚本并传入变量,同时还使用变量化的perl脚本名称

Ric*_*ick 6 php perl integration

我通常从PHP调用perl脚本,如下所示,并以这种方式传入变量,并且它工作正常,但是现在我正在构建一个重用组件,我想要变量我传入的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();
Run Code Online (Sandbox Code Playgroud)

我试图variablize 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();
Run Code Online (Sandbox Code Playgroud)

Pek*_*ica 9

你的方式不起作用,因为你连接所有参数没有空格,有效地使它们成为一个参数.

尝试

$perlscript_file = "/var/www/other_scripts/perl/apps/$perlscript.pl $var1 $var2 $var3 $var4";
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果参数来自外部源,您必须使用它们进行消毒escapeshellarg().同样适用$perlscript- 如果它来自外部源或甚至用户输入,请执行操作 escapeshellcmd().


Gor*_*don 6

在旁注中,有一个CPAN包,旨在提供PHP和Perl之间的桥梁,这将允许您在PHP中执行以下操作:

$perl = Perl::getInstance();
$instance = $perl->new('perlclass', @args);
Run Code Online (Sandbox Code Playgroud)

不知道这有多稳定.看到

如果您使用的是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));
Run Code Online (Sandbox Code Playgroud)

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