我正在尝试使用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
的内容时,输出结果是一个目录列表,不出所料。顺便说一句,如果重要的话,我确实把调用的脚本改成了755……
更新-我将exec调用移到了调用脚本的末尾,至少现在我在输出中看不到调用脚本的执行。感谢海报,我将尝试其中的一些想法。
帮助!
谢谢史蒂夫
发布于 2010-05-20 01:49:18
我也遇到了这个问题,结果发现这是php (#11430)中的一个bug。修复方法是在一个php脚本中调用另一个php脚本时使用php-cli。因此,您仍然可以使用exec,但在浏览器中调用它时,请使用php-cli而不是php:
exec("php-cli somescript.php");
这对我很有效。
发布于 2009-02-19 17:18:13
exec所做的是接受最右边的命令,并将其附加到您的目的地。如果您的php脚本中有shebang行,则不需要包含php解释器的binary指令。
如果您只想要脚本的输出,请尝试:
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
发布于 2009-02-19 20:59:12
问题出在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')
这是我唯一能让它工作的方法。
https://stackoverflow.com/questions/566248
复制相似问题