当前位置:  开发笔记 > 编程语言 > 正文

无法使用PHP exec执行PHP脚本

如何解决《无法使用PHPexec执行PHP脚本》经验,为你挑选了3个好方法。

我试图使用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调用移动到调用脚本的末尾,至少现在我没有看到在输出中执行调用脚本.感谢海报,我会尝试其中的一些想法.

救命!

谢谢Steve



1> 小智..:

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

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

这对我有用.


我也在很长一段时间里对此表示不满.真正的难题是使用带有"php"的exec似乎在ubuntu下工作正常,但是当我部署到centos服务器时,它不起作用.php-cli就是答案,谢谢!

2> John T..:

exec正在做的是采取最右边的命令并将其附加到目的地.如果你有家当线在你的PHP脚本,你应该不需要包括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')

以上应该只向execoutput输出"Hello World".

编辑:

有趣的是你得到这种行为.你声明命令"ls"有效.尝试为此创建别名并将其转发到如下文件:

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

然后

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

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

-约翰



3> Luiz Damim..:

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

前段时间我遇到了同样的问题.我所做的是创建一个runscript.phpin/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')

这是我设法让这个工作的唯一方法.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有