【PHP】 exec()で標準エラー出力を取得する方法

更新日:2023/01/13

PHPのexec関数は、コマンドが標準出力に出力したメッセージを取得できます。
しかしコマンド内でエラーが出た場合は、標準エラー出力に出力していることが多い。

デバッグなどでエラーの原因を知りたいときは、致命的だったりします。

そこで、exec関数で標準エラー出力を取得する方法をお伝えします。

 

リダイレクト機能を使う

exec関数は仕様上、標準出力のみを捕捉します。
そのため、標準エラー出力を取得できません…

そこで、コマンドのリダイレクトという機能を使って、標準エラー出力の出力先を標準出力にリダイレクトします。

コマンドの後に、 ' 2>&1' を付ければOK。

2は標準エラー出力のハンドル値、1は標準出力です。
1に&を付けないと、1という名前のファイルに出力します。
なので、&が必要です。

exec('cd aaa 2>&1',$out);
var_dump($out);

aaaというディレクトリが無いという前提です。

実行すると、次のような結果になります。

array(1) {
  [0]=>
  string(46) "cd: aaa: No such file or directory"
}

この方法は、元々の標準出力も一緒に出力されます。

 

ファイルに出力する

前項は標準出力していますが、リダイレクトを使ってファイルに出力することもできます。

コマンドの後に、 ' 2>ファイル名' を付けます。

exec('ls 2>err.log',$out);
var_dump($out);

この方法は、エラーと通常のメッセージを切り分けることができます。

なお、これは毎回上書きされます。

追加書き込みは、' 2>>ファイル名' のように、>を二つ重ねます。

更新日:2023/01/13

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。