某种类型的perl文件在执行PHP exec函数时没有输出


A certain type of perl file is not giving output on execution from the PHP exec function

我的操作系统是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中运行它时没有得到输出,即使手动运行它时可以看到输出。

你有几个选择。其中两个如下:

  1. 调用exec()时将STDERR重定向到STDOUT

    `exec('perl test.pl 2>&1', $out, $r);`
    
  2. 在Perl脚本中将输出消息写入STDOUT

    如果输出是预期的,我会将您的print STDERR调用更改为简单的print调用。

在这个堆栈溢出答案中有更多选项:

    PHP标准错误