16

我正在尝试使用 PHP exec 调用来调用一个需要几秒钟的脚本(第 3 方的 Web 服务)。经过一番挣扎,我将其简化为经典的 hello world 示例。调用脚本如下所示:

exec('/usr/bin/php /home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &');

当我运行它时,输出execoutput.txt包含调用脚本页面的副本,这hello world与我预期的不同。

为什么我不能让这个 PHP 脚本使用 exec 来执行?请注意,当我将命令更改为类似ls -l时,输出是预期的目录列表。顺便说一句,以防万一,我将调用的脚本chmod到755 ...

更新- 我将 exec 调用移到调用脚本的末尾,至少现在我没有看到输出中执行的调用脚本。感谢海报,我将尝试其中一些想法。

帮助!

谢谢史蒂夫

4

6 回答 6

28

我也遇到了这个问题,事实证明这是 php (#11430) 中的一个错误。修复方法是在 php 脚本中调用另一个 php 脚本时使用 php-cli。所以你仍然可以使用 exec 而不是使用 php 在浏览器中调用它时使用 php-cli :

exec("php-cli  somescript.php");

这对我有用。

于 2010-05-19T17:49:18.283 回答
16

exec 正在做的是获取最右边的命令并将其附加到您的目的地。如果您的 php 脚本中有 shebang 行,则不需要包含 php 解释器的二进制指令。

如果您只想要脚本的输出,请尝试:

exec('/home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &')

但是,如果您不希望错误出现在文件中,则应在输出到文件之前重定向 STDERR。像这样:

exec('/home/quote2bi/tmp/helloworld.php 2> /dev/null > /tmp/execoutput.txt')

以上应该只将“Hello World”输出到 execoutput。

编辑:

有趣的是你得到了这种行为。您说命令“ls”有效。尝试为此创建别名并将其转发到如下文件:

alias pexec='php /home/quote2bi/tmp/helloworld.php'

然后

exec('pexec > /tmp/execoutput.txt 2>&1 &')

这似乎是 exec 处理输入的方式而不是 shell 本身的问题。

-约翰

于 2009-02-19T17:18:13.263 回答
8

问题在于 PHP 本身,它将脚本中的所有内容都视为 $argv。它不会将输出重定向到 /dev/null 的文件。

前段时间我遇到了同样的问题。我所做的是runscript.php在 /opt/php-bin 中创建一个,然后在这个脚本中运行它应该运行的内容。像这样的东西:

$script = $argv[1]
$params = implode(' ', array_slice($argv, 2));
$cmd    = "{$script} {$params} > /dev/null &";

$output = array();
$return = 0;
exec("php {$cmd}", $output, $return);

exit((int)$return);

然后你调用它使用:

exec('/opt/php-bin/runscript.php /path/to/your/script.php arg1 arg2')

这是我设法让它工作的唯一方法。

于 2009-02-19T20:59:11.880 回答
0

为了避免 PHP 在这方面的问题,为什么不把它放在一个 shell 脚本中呢?然后 PHP 可以执行在内部处理所有重定向的 shell 脚本。

如果您需要动态更改内容,那么为什么不编写 shell 脚本然后执行它(当然,事后清理)?

于 2009-02-26T02:04:20.300 回答
0

如果您只是简单地运行 php 脚本,则执行整个代码的一种可能方法是使用 include(),它将运行 php 文件并输出任何结果。您不能将输出定向到文本文件,但如果您是 Hello World php 脚本,它应该出现在浏览器窗口中

<?php echo "Hello World!"; ?>

然后它将在浏览器中吐出。所以你的第二个代码看起来像

<?php include("helloWorld.php");  echo " PHP ROCKS";?>

产生一个看起来像的页面,

你好世界!PHP 岩石

于 2010-10-02T18:12:14.790 回答
0

这就像您从浏览器运行脚本一样运行。

这是在 linux 平台上进行项目时遇到的。

exec('wget http://<url to the php script>)

希望这可以帮助!!

于 2014-01-07T06:21:50.750 回答