34
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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だと拾えるのか。。。
ちょっともやもやします。

34
36
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?