3

我需要composer.phar update从 Web 控制器运行。

我可以以这种方式运行各种常规命令(ls,cp等),但是当我调用 phar 文件时,我得到空输出。

我的代码如下所示:

class Maintenance_Controller
{
    public function do_maintenance()
    {
        echo exec("/usr/bin/env php composer.phar", $out, $ret);
        var_dump($out); // outputs -> array()
        var_dump($ret); // outputs -> int(127)
    }
}

127表示路径不好,但我确定我在正确的目录中。

此外,这在使用 php_cli 包装器时有效,所以可能与www-data用户有关?chmod 777没有帮助,无论如何我都讨厌这样做。

我也使用了passthru(),system()和 backtic 语法。我无法理解这不起作用的原因。我似乎无法从代码exec()之外的调用中询问 stderr 或 stdout。127

明显的问题:

我究竟做错了什么?

更好的问题:

有没有更好的方法来.phar从脚本中查询和执行文件?

4

1 回答 1

3

更新:

这个问题

当在您的 PATH 系统变量中找不到给定命令并且它不是内置的 shell 命令时,/bin/sh 返回值 127。

尝试使用exec('php composer.phar', $out, $ret);,看看是否有效。您可能还需要使用完整路径,php如果它位于您可能从中获取的非标准位置which php


我不确定你为什么在passthru这里使用。我会使用exec更好的处理。idexec在这里使用而不是passthru

class Maintenance_Controller
{

    public function do_maintenance()
    {
        exec("composer.phar update", $out, $ret);
        if(!$ret) {
            // handle success
        } else {
           // handle error
        }

    }
}

这样,您就可以按行输入所有输出$out以及shell return val(如果可以,则为0,如果不是,则> 0)。如果您想真正花哨,可以循环$out并扫描错误,然后构建并抛出异常。

于 2012-12-07T01:48:35.560 回答