无法使用 PHP 执行执行 PHP 脚本

2022-08-31 00:06:53

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

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

当我运行此命令时,输出包含调用脚本页的副本,而不是我预期的。execoutput.txthello world

为什么我无法使用 exec 执行此 PHP 脚本?请注意,当我将命令更改为类似 ,输出是预期的目录列表。顺便说一句,如果这很重要,我确实将调用的脚本设置为755...ls -l

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

帮助!

谢谢史蒂夫


答案 1

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

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

这对我有用。


答案 2

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”给执行输出。

编辑:

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

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

然后

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

这似乎是exec处理输入的方式与shell本身相比存在问题。

-约翰


推荐