FuelPHPはconfig.phpとdb.phpに以下のように設定するとCode Profilerに実行したSQLや実行にかかった時間を表示してくれます。
config.php
profilingをtrueにしている状態でpostgresqlのログに以下のようなログが記録されていました。
疑問が2つありました。
ソースを確認します。
\core\vendor\phpquickprofiler\phpquickprofiler.php
に以下の記述があります。
config.php
return array(
中略
中略
'profiling' => true,
中略
);
db.php
db.php
return array(
'default' => array(
中略
'profiling' => true,
中略
),
);
profilingをtrueにしている状態でpostgresqlのログに以下のようなログが記録されていました。
nobody,ap2,192.168.0.15(53707),24877,2013-03-01 15:20:29.688 JST,42501,ERROR: permission denied for relation access_log
nobody,ap2,192.168.0.15(53707),24877,2013-03-01 15:20:29.688 JST,42501,STATEMENT: EXPLAIN SELECT 以下略
疑問が2つありました。
- access_logテーブルにアクセスする場合は、ちゃんと$result = DB::query('SELECT * FROM access_log')->execute('root');な感じで、db.phpに設定したrootのユーザーでアクセスしているので、permission deniedとなるのはおかしい
- そもそもなぜEXPLAINが先頭にくるSQLを発行しているのかわからない
\core\vendor\phpquickprofiler\phpquickprofiler.php
に以下の記述があります。
/*--------------------------------------------------------
CALL SQL EXPLAIN ON THE QUERY TO FIND MORE INFO
----------------------------------------------------------*/
function attemptToExplainQuery($query) {
if (substr($query['sql'],0,6) == 'SELECT')
{
$rs = false;
try {
$sql = 'EXPLAIN '.html_entity_decode($query['sql'], ENT_QUOTES);
$rs = \DB::query($sql, \DB::SELECT)->execute();
}
catch(Exception $e)
{}
if($rs) {
$query['explain'] = $rs[0];
}
}
return $query;
}
profilingをtrueにしているとこの関数が実行されますが、execute();になっているので、rootでSQLが実行されずに、permission deniedになります。
では問題があるかというと、EXPLAINをつけて発行したSQLの実行結果を使っていない(表示していない)、profileがfalseになっている場合、この関数は実行されないので、特に問題ないかと思います。
ちなみに、途中経過をvar_dumpしてみると
arrayprofilingをtrueにしているとこの関数が実行されますが、execute();になっているので、rootでSQLが実行されずに、permission deniedになります。
では問題があるかというと、EXPLAINをつけて発行したSQLの実行結果を使っていない(表示していない)、profileがfalseになっている場合、この関数は実行されないので、特に問題ないかと思います。
ちなみに、途中経過をvar_dumpしてみると
'sql' => string 'SELECT * FROM table' (length=95)
'time' => float 10.288000106812
'explain' =>
array
'QUERY PLAN' => string 'Aggregate (cost=1.12..1.13 rows=1 width=0)' (length=43)
な感じで、PostgreSQLでEXPLAINした結果の最初の一行だけ取得していますが…表示するならEXPLAINで取得した結果全部を表示しないと意味なあ…と思いました。