首页 文章

无法使用PHP exec执行PHP脚本

提问于
浏览
15

我试图使用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 ...

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

救命!

谢谢Steve

6 回答

  • 0

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

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

    这对我有用 .

  • 8

    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')
    

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

    Edit:

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

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

    然后

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

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

    -约翰

  • 28

    问题出在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')
    

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

  • 16

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

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

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

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

    导致页面看起来像,

    你好,世界! PHP ROCKS

  • 1

    为了避免在这个领域中陈述PHP的问题,为什么不将它放在shell脚本中呢?然后,PHP可以执行shell脚本,该脚本具有内部处理的所有重定向 .

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

  • 0

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

    这是在linux平台上开展项目时遇到的 .

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

    希望这可以帮助!!

相关问题