web-dev-qa-db-ja.com

PHP exec()は出力にエラーメッセージを返さない

Svnコマンドの特定の出力をXML形式で取得しようとしています。有効なパラメーターを入力しても出力は正常です。ただし、間違ったパスワードを入力すると、出力にエラーメッセージが表示されません。これはPHPコードです:

exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/', $output);

これは、ターミナルで取得する出力です。

<?xml version="1.0"?>
<log>
svn: OPTIONS of 'http://a51.unfuddle.com/svn/a51_activecollab': authorization failed: Could not authenticate to server: rejected Basic challenge (http://a51.unfuddle.com)

次に、var_dumpを使用して$ output変数から取得する出力を示します。

array(2) {
[0]=>
string(21) "<?xml version="1.0"?>"
[1]=>
string(5) "<log>"
}

ご覧のとおり、$ output変数は、ターミナルが出力する3行目の出力を返しません。ターミナルで取得するのと同じ出力を取得するのを手伝ってください(Shell_exec()またはsystem()メソッドで試しましたが、exec()と同じ出力を返します)完全な出力を取得するにはどうすればよいですか?前もって感謝します!

40
Goran

stderrもキャプチャする必要があります。

stderrstdoutにリダイレクトするとうまくいきます。追加2>&1コマンドの最後まで。

例えば.

exec("/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/ 2>&1", $output);
76
racetrack

それはおそらく解決策ではなく、単に悪い提案です:コマンドに余分なエコーを追加しようとしましたか?

exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/;**echo ""**', $output);

そして、それを解決するもう1つの方法は、すでに述べたとおりです。$ outputに最後の行がない場合は、とにかくexec()関数の戻り値にあります。そうしたら

$totalOutput = Push($msg,$output);

$msg = exec('/usr/bin/svn --username something --password something --non-interactive log -r HEAD --xml --verbose http://a51.unfuddle.com/svn/a51_activecollab/', $output);
0
Cedric