PHP で標準エラー出力にメッセージを出力する方法(各種)
Qiita 記事に絞って「php 標準エラー出力」でググっても、ピンポイントのタイトルの記事がなかったので、自分のググラビリティとして。
TL; DR (今北産業)
fputs(STDERR, 'my error message');
$ # 標準出力(STDOUT)へ出力するも 1>/dev/null で標準出力を潰してみる
$ php -r 'fputs(STDOUT, "hoge". PHP_EOL);' 1>/dev/null
$ # 1>/dev/null で標準出力を潰しつつ標準エラー出力(STDERR)へ出力
$ php -r 'fputs(STDERR, "hoge". PHP_EOL);' 1>/dev/null
hoge
$ # STDERR定数の内容確認
$ php -r 'echo STDERR . PHP_EOL;'
Resource id #3
- オンラインで動作をみる @ paiza.IO
TS; DR
PHP で標準エラー出力に出力するには、いくつかの方法があります。
I/O ストリーム編
fwrite + STDERR定数
fwrite()
でSTDERR
に書き込む
「STDERR
」定数は、標準エラー出力への「出力ストリームのリソース」が割り当てられた定数です。つまり、標準エラー出力へのファイルポインタです。利用後の fclose()
の心配はいりません。
$msg_error = 'standard error' . PHP_EOL;
fwrite(STDERR, $msg_error);
- 参考文献
- 入出力ストリーム定数 | コマンドラインの使用法 @ PHP 公式マニュアル
- fwrite | ファイルシステム関数 @ PHP 公式マニュアル
fputs + STDERR定数
fputs()
はfwrite
のエイリアス(別名)
fwrite
を使うと fopen
や fclose
も使わないといけない印象を与えてしまうため、可読性を優先するなら fputs
が良いと思います。
$msg_error = 'standard error' . PHP_EOL;
fputs(STDERR, $msg_error);
- 参考文献: fputs | ファイルシステム関数 @ PHP 公式マニュアル
エラー処理関数編
error_log()
関数の出力先を、標準エラー出力のファイル・ポインタ(php://stderr
)に設定する
後日、ファイル出力が必要な場合にも対応できるメリットがあります。バイナリセーフではありません。
ini_set('error_log', 'php://stderr');
$msg_error = 'standard error' . PHP_EOL;
error_log($msg_error);
$ # 設定ディレクティブの確認(未設定を確認)
$ php -r 'echo ini_get("error_log") . PHP_EOL;'
$ php -r 'error_log("hoge");' 1>/dev/null
hoge
$ # 設定を変更してログ出力
$ php -r 'ini_set("error_log", "php://stderr"); echo ini_get("error_log") . PHP_EOL;'
php://stderr
$ php -r 'error_log("hoge");' 1>/dev/null
hoge
- 参考文献: error_log | エラー処理関数 @ PHP 公式マニュアル
ファイル・ストリーム編
php://
ファイルストーリム
標準エラー出力のファイル・ポインタ(
php://stderr
)を開き、書き込む
「site:php.net/manual/ja 標準エラー出力」と PHP 公式マニュアルに絞ってググると出てくる方法で、古いブロクでも良く見かける方法です。
「ファイルを開く」「書き込む」「クローズ」というファイルの読み書きの基本を使った方法であるものの、標準エラー出力の場合は前述の STDERR
が用意されているので、fputs()
を使った方がコードがスッキリします。
$msg_error= 'standard error' . PHP_EOL;
$stderr = fopen('php://stderr', 'w');
fwrite($stderr, $msg_error);
fclose($stderr);