PHPデバッグ作業用ログ出力あれこれ


デバッグ

変数内のデータがどういう状態にあるのかを知ることは、デバッグするうえで非常に重要な情報となります。
PHPでは変数内に何が入っているのかという情報を得るために以下のような関数が用意されています。
出力のフォーマットや情報量に差がありますが、print_rとvar_exportを覚えておくとよいとおもいます。

print_r関数

得られる情報量はおそらく3種の中で一番少ないですが、第二引数にtrueを付けることでダイレクトに出力せずにテキストとして取得することができるようになります。
$debug = print_r($var, true);

var_dump関数

この関数を私があまり使うことがないのは、変数内に格納することができないからです。
そのため後述するログ関数と組み合わせて使うことはできず、そのまま画面や標準出力に出してしまうことしかできないのです。
画面の上のほうに変数内のダンプデータがガガガッとでてきて画面の表示が変になったりくずれます。 画面やターミナルに出せるような機能であれば、いいのですが定期実行バッチであったりLaravelのQueueとかの調査になるとvar_dumpでは白旗を上げざるを得ません。

使い方はいたってシンプルです。
var_dump($var);

var_export関数

こちらも、第二引数にtrueを付けることでダイレクトに出力せずにテキストとして取得することができるようになります。
$debug = var_export($var, true);

ファイルに書き出す

error_log関数

ログを書き出すための関数です。
書き出すテキストだけしか指定せずにデフォルトで使うと、システムで設定されているエラーログファイルに書き出しされます。
error_log(print_r($var, true));

もし、任意の場所に書き出したいのであれば、追加の引数を指定して以下のようにします。
error_log(print_r($var, true), 3, '/tmp/debug.txt');

file_put_contents関数

変数内のテキストをファイルに一気に書き出すことができる関数です。
書き出し先は第一引数で任意のファイルパスを指定して自由に選べます。
第三引数を省略すると、書き出しのたびにファイルがリセットされます。
file_put_contents('/tmp/debug.txt', print_r($var, true));

追記型でどんどん書き出しをストックしていきたい場合は、第三引数にフラグ定数をセットします。
file_put_contents('/tmp/debug.txt', print_r($var, true), FILE_APPEND);

主要フレームワークのログ出力関数

CakePHP3

Logクラスを使います、第一引数はログのラベルです。
Log::write('debug', $message);
Cake\Log\Logをuseしている箇所であれば、logメソッドを使うこともできます。
こちらでラベリングする際は第二引数に値を渡します。
$this->log($message, 'debug');
ラベルにはEmergency、Alert、Critical、Error、Warning、Notice、Info、Debugの8種類が利用できます。

ドキュメント
https://book.cakephp.org/3/ja/core-libraries/logging.html#filelog

Laravel7

Logクラスを使います。ログのラベルごとに違うメソッドを使います。
Log::emergency($message);
Log::alert($message);
Log::critical($message);
Log::error($message);
Log::warning($message);
Log::notice($message);
Log::info($message);
Log::debug($message);
ドキュメント
https://readouble.com/laravel/7.x/ja/logging.html

CodeIgniter3

log_message関数を使います、第一引数はログのラベルです。
log_message('error', $message);
log_message('debug', $message);
log_message('info', $message);
ドキュメント
https://codeigniter.jp/user_guide/3/general/errors.html?highlight=log#log_message

FuelPHP

Logクラスを使います。ログのラベルごとに違うメソッドを使います。
Log::info($message);
Log::debug($message);
Log::warning($message);
Log::error($message);
ドキュメント
http://fuelphp.jp/docs/1.7/classes/log.html