PHPで画面出力する場合、次のような関数をよく使うと思います。
- print_r
- var_export
- var_dump
手軽に変数の中身を表示したり、エラー内容を表示するのにはこういう関数は便利ですよね。
ただし、こういうブラウザ出力系の関数が使えないケースもあって、そういう時は外部ファイルへの出力によるデバッグが必要です。
そこでPHPでログファイルを使ってデバッグする方法をまとめました。
print_rなどでデバッグできないケースとは・・
まず冒頭で書いたブラウザ出力系の関数が使えない場合について少し説明します。
その典型的な例はAjaxでPHPスクリプトを呼び出したり、結果を受け取ったりする場合です。
例えばあるページからAjax経由で hoge.php というPHPを実行するJSコードを書いたとしましょう。例えばシンプルなコードを書くなら次のような感じ
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/** hoge.php を呼び出し */ $.ajax('hoge.php', { type: 'post', data: { 'value': 'hoge' } }) .done(function(data){ /// 例えばここでは真偽値のみを受け取りたい }) .fail(function(){ console.err('通信エラー発生') }); |
Ajaxでは呼び出し成功後のコールバック関数として done メソッドというのが用意されています。このメソッドの引数 data ではPHPから出力された内容を受け取れます。
このようなAjaxのコールバックで値受け取りしたいときは print_r などはデバッグに使えません。
例えば呼び出し先の hoge.php で次のようなコードを書いたとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/** Ajaxからのデータ受け取り */ if( isset( $_POST['value'] ) ){ $value = $_POST[ 'value' ]; } /** デバッグ用に何か出力 */ print_r('This is debug message'); /** true または false を返す */ if( $value !== '' && $value === 'hoge' ) { echo 'true'; } else { echo 'false'; } die; |
上の処理ではAjaxから渡されたデータが 'hoge' なら true を、それ以外なら false を返すという処理を書こうとしています。
が、途中の7行目でデバッグ用に出力してるのが問題です。
本来ならAjaxの done 関数には真偽値だけ渡したいんですが、デバッグしたせいで 'This is debug message' という余計なデータまで含まれてしまいます。
こういう風にPHP側から何か値を返したいときはブラウザ出力系の関数は使えません。
この問題への対処法は外部(ログファイルなど)にデバッグ情報を出力してあげることです。
ログファイルでデバッグする手順
ここまで書いたようにAjaxを使っていると print_r などでデバッグ不可です。
なのでそういう特殊な場合はログファイルにデバッグ出力する方法を使います。その手順について簡単にまとめると次の通り
まず次のような感じでドメイン直下の適当な場所にデバッグ用のファイルを作成します。
1 2 3 4 |
- root(ルートディレクトリ) - data - log - debug.txt |
ここでは説明のためにドメイン直下に /data/log ディレクトリを作成、その中に debug.txt を配置するという構成にしてます。まあ構成については人それぞれですね。
そうしたら次のような専用のデバッグ関数を作成
1 2 3 4 5 6 7 8 9 10 11 12 |
/** * ログファイルに出力するのデバッグ用関数 * @param mixed $data debug.txtに出力するデータ * @param boolean $clear_log ログを消去するかどうか **/ function _debug( $data, $clear_log = false ) { $uri_debug_file = $_SERVER['DOCUMENT_ROOT'] . '/data/log/debug.txt'; if( $clear_log ){ file_put_contents($uri_debug_file, print_r('', true)); } file_put_contents($uri_debug_file, print_r($data,true), FILE_APPEND); } |
やってることは file_put_contents 関数を使ってデバッグファイルに print_r した結果を出力してるだけです。もちろん print_r でなく var_export や var_dump を使ってもOK
ちなみに2番目引数に true を渡すと今までのログ出力が全てクリアできます。
あとはPHPコードの好きな位置でこの関数を呼び出せばデバッグ可能
1 2 3 4 5 |
/** デバッグ出力を一旦クリア */ _debug('', true); _debug( 'This is debug message.' ); _debug( [2, 3, 5, 7, 11, 13, 17, 19]); |
こうすれば出力用バッファを汚す心配が全くありません。いくらでも好きなようにメッセージとかデータの中身の確認作業ができます。
補足 : デバッグに役立つその他のテクニック
今紹介したログファイル出力以外にもデバッグに便利なテクニックは色々あります。
このブログでも色々紹介しているので興味のある方は次記事もどうぞ
デバッグ作業を便利にするのに役立つかもしれません。
ここまでのまとめ
もし何らかの事情があってPHP側で print_r などが使えない場合、こういうファイル出力できる関数を作るとデバッグ作業が捗ります。
特にAjaxだとブラウザ出力系の関数はデバッグに使えないのでファイル出力必須かもしれません。
以上、PHPでログファイルにデバッグする方法についてでした。ではでは($・・)/~~~