我正在尝试使用PHP exec调用来调用一个需要几秒钟(与第三方的Web服务)的脚本。经过多次努力,我把它减少到了经典的hello world例子。调用脚本如下所示:
exec('/usr/bin/php /home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &');
当我运行它时,输出execoutput.txt
包含调用脚本页面的副本,而不是我预期的hello world
。
为什么我不能使用exec执行此PHP脚本?请注意,当我将命令更改为ls -l
之类的内容时,输出是按预期方式列出的目录。顺便说一句,如果重要的话,我把调用的脚本chmod到了755 ......
更新 - 我将exec调用移到了调用脚本的末尾,至少现在我没有看到输出中执行的调用脚本。感谢海报,我会尝试其中的一些想法。
帮助!
由于 史蒂夫
答案 0 :(得分:28)
我也有这个问题,结果发现这是php中的一个错误(#11430)。修复是在php脚本中调用另一个php脚本时使用php-cli。所以你仍然可以使用exec,而不是在浏览器中调用它时使用php使用php-cli:
exec("php-cli somescript.php");
这对我有用。
答案 1 :(得分: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本身的问题。
-John
答案 2 :(得分:8)
问题在于PHP本身,它在脚本中将所有内容视为$ argv。它不会将输出重定向到文件ou / dev / null。
前段时间我遇到了同样的问题。我所做的是在/ opt / php-bin中创建一个runscript.php
,然后在这个脚本中运行它应该运行的内容。像这样:
$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')
这是我设法让这项工作成功的唯一方法。
答案 3 :(得分:1)
如果你只是简单地运行一个php脚本,一种可能的方法来执行整个代码就是使用include()来运行php文件并输出任何结果。您不能将输出定向到文本文件,但如果您是Hello World php脚本,它应该出现在浏览器窗口中
<?php echo "Hello World!"; ?>
然后它会在浏览器中吐出来。所以你的第二个代码看起来像
<?php include("helloWorld.php"); echo " PHP ROCKS";?>
导致页面看起来像,
你好世界! PHP ROCKS
答案 4 :(得分:0)
为了避免在这个领域中陈述PHP的问题,为什么不将它放在shell脚本中呢?然后,PHP可以执行shell脚本,该脚本具有内部处理的所有重定向。
如果您需要动态更改内容,那么为什么不编写shell脚本然后执行它(当然,之后要清理)?
答案 5 :(得分:0)
这就像从浏览器运行脚本一样。
在linux平台上开展项目时遇到了这个问题。
exec('wget http://<url to the php script>)
希望这会有所帮助!!