php で 簡単にデバッグする方法
尾藤正人です。
Perl での print debug の方法の紹介がブーム(?)だったので、自分がよく行ってる Ruby での debug 方法7つについて書いてみます。
ということなので、僕が PHP でやってること書いてみたいと思います。
preprint_r()
print_r() とか var_dump() だと HTML の中に出してブラウザで見るときにすごく見にくくなります。 そこで preprint_r() という関数を定義して、<pre></pre> で囲んで見やすいように出力しています。
function preprint_r(&$var, $title = '') { echo _preprint_r($var, $title); } function &_preprint_r(&$var, $title = '') { if (!defined('UNOH_DEV') && UNOH_DEV) { return ''; } $html = '<table>'; if ($title) { $html .= "<tr><th align=\"left\">$title:</th></tr>"; } $html .= '<tr><td><pre>'; $html .= htmlspecialchars(print_r($var, true)); $html .= "</pre></td></tr></table>\n"; return $html; }
preprint_r() では UNOH_DEV が定義されているかどうかチェックしています。 開発版の場合は UNOH_DEV が必ず定義されているので、もし仮にデバッグで入れた preprint_r() がプログラムに残った状態でコミットされても、本番環境で表示されないようにしています。
実はこの preprint_r() という関数は前職の HDE にいた頃に覚えました。 大変便利なので、僕はいつもこの関数を定義して使うようにしています。
preprint_r smarty plugin
smarty の中でも使いたいということで preprint_r smarty plugin も作っています。
function smarty_function_preprint_r($params, &$smarty) { if (empty($params['var'])) { $smarty->trigger_error("preprint_r: missing 'var' parameter"); return; } $title = isset($params['title']) ? $params['title'] : ''; return _preprint_r($params['var'], $title); }smartyテンプレートの中で
{preprint_r var=$hoge}
という風に書くと変数がダンプされて表示されます。
set_error_handler() でエラーが起きた時にメールを送信する
PHP ではエラーが起きた時にどういう処理を行うかを set_error_handler() を使って変更することができます。 フォト蔵ではエラーが起きた時にメールで送信するようになっていて、エラータイプ、エラーメッセージ、エラーが起きたファイル、行数、URI、$_SERVER, $_COOKIE とかの変数のダンプ、バックトレース等、デバッグに必要な情報を送信しています。
ウノウでは開発者毎にバーチャルドメインをきって開発環境が独立しているので、個人の開発環境で起こったエラーは個人に送るようにしていて、本番環境で起こったエラーに関してはみんなに送信するようにしています。
xdebug を使う
xdebug にはいろいろ機能がありそうですが、プロファイラーにしか使ってません。
プログラムの最後に
preprint_r(xdebug_get_profiler_filename(), 'profile');という風に書いておくと
/home/masato/photo/var/xdebug/cachegrind.out.573339192
こんな感じでプロファイルの情報が入っているファイル名が表示されます。これをプロファイラで表示してやれば、どの処理にどれくらい時間がかかってるのかがすぐ分かるようになります。
僕は WinCacheGrindというソフトウェアを使ってます。ホームディレクトリを samba で共有しているので、Windows からそのままファイルを開くだけで大丈夫です。
コメント
私は,以下の print_a() をカスタマイズして使っています.
http://www.atomar.de/public/code/debuglib/debuglib.demo.php
あとは,dBug というのもありますね.
http://dbug.ospinto.com/
投稿者: sunaoka | 2006年10月10日 18:42
ありがとうございます。
print_a() というのがあったのは知りませんでした。
dBug は以前から知ってて使ったことがあったのですが、dBug ってインクルードすると勝手に HTML タグを吐き出すので、困ってすぐにやめてしまいました。
投稿者: masato | 2006年10月10日 19:57
私はPEAR::Var_Dumpを使ってます。
出力形式を選べるので便利です。
投稿者: Kiske | 2006年10月13日 13:29
PEAR::Var_Dump って本番環境で間違って出力するのを防ぐために、何かフラグがたってたら出力しなくするような機能ってありますか?
なければいずれにせよラップして使わないとダメですね。
投稿者: masato | 2006年10月13日 17:51