【PHP】オレオレ backtrace ログを出力して呼出元を辿る

PHP では debug_print_backtrace() でバックトレースを表示できるので、以下の例のようにプログラムがどういう順番で実行されたかをデバッグすることができる。

例えばこんな感じの3つのファイルがあった場合

出力はこうなる。

オレオレ backtrace


便利なことにはかわりないのだけど、僕にはこれが(引数でいくらか制御可能とは言え)少し冗長で見づらいので欲しい情報だけを出力するオレオレ backtrace をすることにした。情報は debug_trace() で入手できるのでこれをゴニョゴニョする。

この関数の要点は以下の通り。

  1. グローバルに定義した $is_debug でデバッグの時以外は何もしない
  2. コマンドラインとブラウザ両方で使うことを想定して改行方法を変更している(debug_print_backtrace() だとブラウザで改行されなくて見辛かった)
  3. $limit でどの階層まで出力するか選べる(debug_print_backtrace() と同じ仕様)
  4. 出力を 【1つ上のディレクトリ/ファイル名 (行数) クラス名::関数名 改行】 とした
  5. 呼び出し順を逆から辿るようにした

出力結果はこうなる。ファイル名がフルパスだと見辛かったからそれを変えたくて正規表現で1つ上のディレクトリより前は削除したおかげで結構見やすくなったと思う。参考: 【PHP】正規表現を用いて文字列を操作する
(print_backtrace() の呼び出し元情報が不要なら foreach の先頭で if ($i == 0) { continue; } する。)

ちなみに

スタックフレームではなく現在の情報(ファイル名や行数)だけが欲しい場合には __FILE__ , __LINE__ などが用意されている。

名前説明
__FUNCTION__現在の関数名
__LINE__現在の行番号
__FILE__現在のファイル名
__CLASS__現在のクラス名
カテゴリー: PHP