PHP - exec()のエラーハンドリングと標準エラー出力の関係をまとめる

  • 24
    いいね
  • 3
    コメント
この記事は最終更新日から1年以上が経過しています。

phpからexec()でコマンド実行した場合のエラー処理まとめ。

出力を処理しない

if ( !exec('command',$array)) {
    //command失敗を検知して処理したい
    echo "NG";
}

これだと、command実行時に標準エラー出力を吐いた場合、そのまま出力されてしまいます。

<commandのエラー出力>
NG

標準エラー出力も標準出力へ吐き出す(2>&1)

標準エラー出力も変数へ突っこんで処理したいなら、

if ( !exec('command 2>&1',$array)) {
    //command失敗を検知して処理したい
    echo "NG";
}
var_dump($array);
array(1) {
  [0]=>
  string(77) "<commandのエラー出力>"
}

エラーメッセージが変数へ代入されます。
exec()の実行自体はエラーにならず、php側で拾えなくなるので注意。

標準エラー出力を捨てる(2>/dev/null)

今度はcommandのエラー出力を捨ててみます。

if ( !exec('command 2>/dev/null',$array)) {
    //command失敗を検知して処理したい
    echo "NG";
}

実行結果

NG

command実行時のエラー出力は出力されず、
なおかつexec()の実行エラーはきちんと拾えたようです。

しかしなぜ2>&1だとexec()の実行エラーは拾えないのに、2>/dev/nullだと拾えるのか。。。
ちょっともやもやします。