Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

smd8122
おてやわらかにおねがいいたします。 https://qiitadon.com/web/accounts/8283
quartetcom
リスティング広告運用総合支援ツール「Lisket」を開発・運営しています。
http://tech.quartetcom.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away