unoh.github.com

php で 簡単にデバッグする方法

Mon Oct 09 22:42:27 -0700 2006

尾藤正人です。

Ruby で debug する7つの方法

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 からそのままファイルを開くだけで大丈夫です。

他に

こんな方法使ってるよっていうのがありましたら、ぜひ教えてください!!