web-dev-qa-db-ja.com

PHP exec()エラー応答を取得する方法は?

以下は、私が実行しようとしたコマンドですが、成功しませんでした:

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess');

最後にdie()を追加すると、エラーがあることがわかります。

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess') or die('what?!');

上記のexec()ステートメントの場合、アクセス許可の問題がエラーの原因ですが、PHPはそれを表示していません。PHPどのエラーからどのように表示しますか発生していますか?

27
Matt

オプションの2番目のパラメーターを渡すと、 exec function の出力結果を受け取ることができます。

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess',$output);
var_dump($output);
19
Eran Galperin

$ outputパラメータは、呼び出し元のプログラムがSTDERRに出力を出力する場合は機能しないようです。

これを処理するより良い方法は、execからの出力をファイルにリダイレクトし、エラー条件が存在する場合はそのファイルの内容を表示することです。

$ cmdがexecコマンドを保持している場合は、次のように追加します。

$cmd.=" > $error_log 2>&1"

次に、$ error_logのファイル指定の内容を調べて、コマンドが失敗した理由の詳細を確認します。

また、コマンドの最後に&を付けてこれをオフにすると、$ error_logの内容をすぐにチェックしてもログ情報が表示されない場合があることに注意してください。OSが完了する前にスクリプトがファイルをチェック/処理する場合があります。

14
S.ov

次のコードは、(StdOutからの)通常の出力と(SdtErrからの)エラー出力の両方をキャプチャします。

exec('ln -s ' . PLUGIN_DIR . '/.htaccess ' . ABSPATH . '/.htaccess' . '2>&1',$output);
var_dump($output);
11
Amaynut

これは私にとっていくつかのシナリオでうまくいきました:

 ob_start();
 exec($cmd . " 2>&1", $output);
 $result = ob_get_contents();
 ob_end_clean();
 var_dump($output);

"2の間のスペースは重要です

これは私にとってうまくいきました:コマンドの最後に2>&1を追加してください。

ここに表示されます: php exec()はsvnコマンドの実行時に出力にエラーメッセージを返しません

乾杯

7
luciomonter

その2番目のパラメーターでエラーが見つからない場合は、Apacheのエラーログを検索できます。たとえば、Ubuntu Server 12.10で、コマンド$ tail /var/log/Apache2/error.logを使用して、python phpからのスクリプト。そのエラーはそこにのみ出力されたため、診断することができました。宜しくお願いします。

3
David L

これは質問への直接の回答ではありませんが、返されたエラーコードによって正確に何が起こったかを知りたい場合に非常に役立ちます。

エラーコード($ res)の場合、コマンドによって返されます:

exec('command', $out, $res);

PHP(コマンドを実行するため)から呼び出されたシェル(BASHなど)から返されたものよりも1〜2、126〜165、255の範囲でした。返されたコードがこれに含まれていない場合(シェルではなく)コマンドによって返された範囲よりも広い範囲。

参照(BASHエラーコードの説明について)

https://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/exitcodes.html

1
maximusin9