3

composer.phar updateWebコントローラーから実行する必要があります。

この方法(、など)であらゆる種類の通常のコマンドを実行できますがlscppharファイルを呼び出すと空の出力が返されます。

私が持っているコードは次のようになります:

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システム変数内に見つからず、組み込みのシェルコマンドではない場合、値127は/ bin/shによって返されます。

使用してみてexec('php composer.phar', $out, $ret);、それが機能するかどうかを確認してください。phpから取得できる可能性のある非標準の場所にある場合は、フルパスを使用する必要がある場合もありますwhich php


ここで使用している理由がわかりませんpassthru。私はexecより良い取り扱いのために使用します。exec代わりにここで使用しますpassthru

class Maintenance_Controller
{

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

    }
}

このようにして、すべての出力を行$outごとに取得し、シェルの戻り値(okの場合は0、そうでない場合は> 0)を取得します。本当に凝ったものにしたい場合は、ループし$outてエラーをスキャンしてから、ビルドして例外をスローすることができます。

于 2012-12-07T01:48:35.560 に答える