Codeigniterではデバック機能でmysql実行機能とかが一覧で見れて大変助かるのですが、プログラムが大きくなってくると大量のsqlが発行されて、それがどこで実行されているのかとかがわからなくなってしまいます。
というわけで、sql文にコメント文章でどこで実行されたのかとかを含めていきたいと思います。
query builderをオーバーライド
Codeigniterではsql実行時に大体getを使って情報を取得します。なので、getを少し改変して開発環境ならコメントを挿入するようにすます。
オーバライドの方法はMY_LoaderでCI_DBを読み込む前に自前のquery_byilderを作って読み込ませる方法を使います。
【CodeIgniter3】クエリービルダー(旧アクティブレコード)を拡張する方法 - あずみ.net
これで、俺俺query builderを作ります。
早速getを上書きします。
protected function _compile_select($select_override = FALSE)
{
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
return $sql;
}
returnされる「$sql」を最後でデバックコメント追加すればOKですね。
コメントに含めるのはdebug_backtraceのログです。実行されたログがたどれますので、便利です。適当なhelperに入れて関数化しておくと、sqllログだけじゃなく、どこでも使えます。
if(!function_exists('backtrace')){
function backtrace($brake_function = 'backtrace', $limit = 0, $last_splice = 0){
$return = false;
$trace
= defined('DEBUG_BACKTRACE_IGNORE_ARGS') ? debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, $limit) : debug_backtrace();
while($callee = array_pop($trace)){
$callee = array_intersect_key($callee, array_fill_keys(array('file', 'function', 'line', 'class'), false));
extract($callee, EXTR_OVERWRITE);
if(isset($callee['class']) &&
get_instance()->router->class == mb_strtolower((string)$callee['class'])){
$return = [];
continue;
}
if($brake_function == $callee['function']) break;
$return[] = $callee;
}
$result = '';
if(is_array($return)){
if($last_splice > 0 && count($return) > $last_splice){
array_splice($return, count($return) - $last_splice, $last_splice);
}
foreach($return as $r){
$result .= "{$r['file']} -> {$r['function']}:{$r['line']}\n ";
}
}
return $result;
}
}
基本的にはControllerを経由して実行されますので、そこからログを取り、それをstringで出力します。
brake_functionでbreak発動させる関数名、limitで行数、$last_splitで最後から指定数行を削除、という感じです。
protected function _compile_select($select_override = FALSE)
{
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if(ENVIRONMENT === 'development'){
$sql.= "\n/*\n " . backtrace('_compile_select') . ' */';
}
return $sql;
}
で、実行されるsql文に含めてあげます。
SELECT *
FROM `entities`
WHERE `entities`.`type` = 'object'
/*
/hoge/application/controllers/App.php -> get_by_many_objects:25
/hoge/application/third_party/aoringo_system/libraries/Acore/drivers/Acore_objects.php -> get_many:342
/hoge/application/third_party/aoringo_system/libraries/Acore/drivers/Acore_objects.php -> get:68
*/
これでsqlログにデバッグが乗るようになりました。
本番環境ではもちろんこのログは乗りません。開発環境では少しくらい実行時間が伸びたとしても問題ありませんよね。ほくほくです。