从 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 脚本名称的主要内容,如果未能解决你的问题,请参考以下文章

从 Perl 脚本运行 PHP

从另一个环境调用 Perl 在后台

如何将信息从 web 传递到 perl 脚本?

Perl - 从外部进程直接输出到标准输出(避免缓冲)

如何在 bash shell 脚本中的 perl 命令调用中使用 shell 变量?

在 PHP 和 Perl 之间传递大量数据