読者です 読者をやめる 読者になる 読者になる

fuelphpでのsqlのログ出力する方法

はじめに

fuelphpで必ずやってる設定などまとめ - とりあえずphpとか
僕がメインでやれる案件では上記の形で開発をしています。こちらにも書きましたが、基本的にsqlをゴリゴリ書くのが好きなのでクエリビルダなどは使わないで開発することが多いです。

その際には、fuelphpのDBクラスにDB::last_queryというメソッドが用意されているのでこれの内容をログ出力する形で進めてきました。

が、今回はクエリビルダを積極的に使っている案件での開発だったので別の方法を調べる必要があったのでメモしておきます

実装方法

プロファイル設定

基本的には開発環境(DEVELOPMENT)での設定になると思います。

development/config.php

return array(
    'profiling' => true,
    'log_threshold' => Fuel::L_INFO,
);

ログレベルの変更とプロファイル設定を有効にしていいます

development/db.php

return array(
    ・・・
    'default' => array(
        'profiling' => true,
    ),
);

こちらも同様にdbのプロファイリング設定を有効にしています

ログ出力の処理

http://qiita.com/tamanyan/items/8daada3541c903d47946
こちらの記事をそのまま参考にさせてもらったのですが、出力の箇所だけ少しいじりました。
ReflectionClassクラスというのがあるんですね、、、自動化のためのテストスクリプトとかでみんな使ってるのかな、、、なにはともあれ記事書いた人に感謝です

あとfuelphpのプロファイラはブラウザでの使用が前提のようなので、エスケープされたsqlをhtmlspecialchars_decodeで元にもどしてログ出力して見やすくしてみました。

development/event.php

<?php
return array(
    'fuelphp' => array(
        'shutdown' => function() {
            $ref = new ReflectionClass('Profiler');
            $prop = $ref->getProperty('profiler');
            $prop->setAccessible(true);
            $profiler = $prop->getValue();
            if ($profiler) {
                $profiler->db = $profiler;
                $profiler->gatherQueryData();
                foreach ($profiler->output["queries"] as $v) {
                    \Log::info(sprintf("[SQLデバッグ]%s\t%s", htmlspecialchars_decode($v["sql"], ENT_QUOTES), $v["time"]));
                }
            }
        },
    ),
);

おわりに

とりあえずこんな感じで、実行されたsqlが参照できるので開発しやすくなりました。
DB::last_queryを記述するより簡単かもしれないのですね

以上です