LoginSignup
12
6

More than 1 year has passed since last update.

【PHP】標準エラー出力する4つの方法

Last updated at Posted at 2020-08-06

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

TS; DR

PHP で標準エラー出力に出力するには、いくつかの方法があります。

I/O ストリーム編

fwrite + STDERR定数

fwrite()STDERR に書き込む

STDERR」定数は、標準エラー出力への「出力ストリームのリソース」が割り当てられた定数です。つまり、標準エラー出力へのファイルポインタです。利用後の fclose() の心配はいりません。

入出力ストリーム定数を使った方法
$msg_error = 'standard error' . PHP_EOL;
fwrite(STDERR, $msg_error);

fputs + STDERR定数

fputs()fwrite のエイリアス(別名)

fwrite を使うと fopenfclose も使わないといけない印象を与えてしまうため、可読性を優先するなら fputs が良いと思います。

fwriteのエイリアス関数fputsを使ってもOK
$msg_error = 'standard error' . PHP_EOL;
fputs(STDERR, $msg_error);
  • 参考文献: fputs | ファイルシステム関数 @ PHP 公式マニュアル

エラー処理関数編

error_log() 関数の出力先を、標準エラー出力のファイル・ポインタ(php://stderr)に設定する

後日、ファイル出力が必要な場合にも対応できるメリットがあります。バイナリセーフではありません。

PHPの設定ディレクティブ"error_log"に標準エラー出力へのファイルポインタを割り当てておいて使う
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);
  • 参考文献
    • php:// | プロトコルラッパー @ PHP 公式マニュアル
    • コメント | error_log @ PHP 公式マニュアル
12
6
0

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
12
6