我的操作系统是Ubuntu, 14.04,我有灯。我想执行一个perl文件从PHP 通过我的浏览器。我只是使用exec函数(在PHP中)来做到这一点,它工作。我在stackoverflow中看到过类似的问题,但它们与此无关。
示例Perl文件test.pl:
#!usr/bin/perl
print "This is a perl file";
示例PHP文件名test.php:
<?php
$perl=exec('perl test.pl',$out,$r); //Works successfully
print_r($out); //Outputs Array ( [0]=>This is a perl file )
?>
但是我需要执行一些其他perl文件。我可以从命令行成功地执行它。让我们假设该文件的名称为: test2.pl
当命令行中以
形式给出命令时perl test2.pl -u argument1 -m argument2 -p testresult
执行上面的命令需要几分之一秒的时间。我在命令行中得到输出。
但是当我在PHP中执行相同的命令时:
<?php
$perl=exec('perl test2.pl -u argument1 -m argument2 -p testresult',$out,$r);
print_r($out); //Outputs Array ( )
?>
输出是
Array
(
)
现在我没有得到输出,但是perl文件正在执行,但我无法得到$out
中的输出。我可以向你保证perl文件被执行了,因为它在执行后也生成了某种文件。
我不明白为什么它不给我输出。
我也尝试过以下函数在php已经:,
exec
system
shell_exec
它们都没有给我输出,它们对test.pl工作得很好,但对test2.pl却不行(上面提到了test.pl和test2.pl)。
我的目标是得到输出。
编辑:解决。多亏了亨特的回答
第二个Perl脚本没有向STDOUT
输出任何内容。在您的第一个Perl脚本中,print
语句没有指定输出目的地,因此它将默认为STDOUT
。在第二个Perl脚本中,每个print
语句要么转到一个文件,要么转到STDERR
(--help
消息除外)。由于PHP exec()
函数只捕获STDOUT
上的输出,因此在PHP中运行它时没有得到输出,即使手动运行它时可以看到输出。
你有几个选择。其中两个如下:
-
调用
exec()
时将STDERR
重定向到STDOUT
`exec('perl test.pl 2>&1', $out, $r);`
-
在Perl脚本中将输出消息写入
STDOUT
如果输出是预期的,我会将您的
print STDERR
调用更改为简单的print
调用。
在这个堆栈溢出答案中有更多选项:
- PHP标准错误