2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

codeigniterのsql実行時に実行場所のファイル名、関数名、ライン番号をコメントで含めてデバッグ表示に出す。

Posted at

Codeigniterではデバック機能でmysql実行機能とかが一覧で見れて大変助かるのですが、プログラムが大きくなってくると大量のsqlが発行されて、それがどこで実行されているのかとかがわからなくなってしまいます。

というわけで、sql文にコメント文章でどこで実行されたのかとかを含めていきたいと思います。

query builderをオーバーライド

Codeigniterではsql実行時に大体getを使って情報を取得します。なので、getを少し改変して開発環境ならコメントを挿入するようにすます。

オーバライドの方法はMY_LoaderでCI_DBを読み込む前に自前のquery_byilderを作って読み込ませる方法を使います。

【CodeIgniter3】クエリービルダー(旧アクティブレコード)を拡張する方法 - あずみ.net

これで、俺俺query builderを作ります。

早速getを上書きします。

DB_query_builder.php
	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で最後から指定数行を削除、という感じです。

MY_query_builder.php
	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ログにデバッグが乗るようになりました。

本番環境ではもちろんこのログは乗りません。開発環境では少しくらい実行時間が伸びたとしても問題ありませんよね。ほくほくです。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?