CakePHP2.x クエリーログを取得する

どんなクエリが発行されているか確認したい場合があった際のメモ

環境

  • CakePHP 2.5.2
  • MySQL 5.5.30

注意

この方法でクエリーログが取得できるのはデバッグレベル2の場合のみ

クエリーログを取得する

1
$log = $this->{$Model}->getDataSource()->getLog(false, false);
  • 第1引数は、ソートの有無。trueの場合はtook(ms)で降順ソート
  • 第2引数では、クエリーを格納している変数の初期化を行うか否か

返却値

以下のデータ構造で返却される。

sample value
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Array
(
    [log] => Array
        (
            [0] => Array
                (
                    [query] => SELECT `username` FROM `users`  AS `User`
                    [params] => Array
                        (
                        )

                    [affected] => 1
                    [numRows] => 1
                    [took] => 1
                )

            [1] => Array
                (
                    [query] => SELECT `name` FROM `groups`  AS `Group`
                    [params] => Array
                        (
                        )

                    [affected] => 1
                    [numRows] => 1
                    [took] => 0
                )
        )

    [count] => 2
    [time] => 1
)

getLogが行っている処理内容

lib/Cake/Model/Datasource/DboSource.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 * Get the query log as an array.
 *
 * @param boolean $sorted Get the queries sorted by time taken, defaults to false.
 * @param boolean $clear If True the existing log will cleared.
 * @return array Array of queries run as an array
 */
public function getLog($sorted = false, $clear = true) {
    if ($sorted) {
        $log = sortByKey($this->_queriesLog, 'took', 'desc', SORT_NUMERIC);
    } else {
        $log = $this->_queriesLog;
    }
    if ($clear) {
        $this->_queriesLog = array();
    }
    return array('log' => $log, 'count' => $this->_queriesCnt, 'time' => $this->_queriesTime);
}

Comments