从 PHP 调用 Perl 脚本并传入变量,同时还使用可变的 perl 脚本名称
Posted
技术标签:
【中文标题】从 PHP 调用 Perl 脚本并传入变量,同时还使用可变的 perl 脚本名称【英文标题】:Calling Perl script from PHP and passing in variables, while also using variablized perl script name 【发布时间】:2011-03-27 04:50:00 【问题描述】:我通常如下从 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();
我尝试改变似乎对我不起作用的 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();
【问题讨论】:
【参考方案1】:您的方法行不通,因为您将所有参数不带空格地连接起来,实际上使它们成为一个参数。
试试
$perlscript_file = "/var/www/other_scripts/perl/apps/$perlscript.pl $var1 $var2 $var3 $var4";
顺便说一句,如果参数来自外部来源,您必须使用escapeshellarg()
对其进行清理。 $perlscript
也是如此 - 如果它来自外部来源甚至是用户输入,请在其上执行 escapeshellcmd()
。
【讨论】:
好的,谢谢,这是有道理的。现在它只是内部的,所以对它们进行消毒没什么大不了的。谢谢你的信息【参考方案2】:在旁注中,有一个 CPAN 包旨在提供 PHP 和 Perl 之间的桥梁,它允许您在 PHP 中执行以下操作:
$perl = Perl::getInstance();
$instance = $perl->new('perlclass', @args);
但不确定这有多稳定。见
PHP::Interpreter Integrating PHP and Perl如果你使用的是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】:在您的第二个代码中,您连接的变量之间没有空格。您应该考虑使用sprintf
来很好地格式化它:
$script = sprintf('/var/www/other_scripts/perl/apps/%s.pl %s %s %s %s', $perlscript, $var1, $var2, $var3, $var4);
【讨论】:
以上是关于从 PHP 调用 Perl 脚本并传入变量,同时还使用可变的 perl 脚本名称的主要内容,如果未能解决你的问题,请参考以下文章