今回はCakePHPのデバッグに重要な
DEBUG値とは
DEBUG値は、
/**
* Set debug level here:
* - 0: production
* - 1: development
* - 2: full debug with sql
* - 3: full debug with sql and dump of the current object
*
* In production, the "flash messages" redirect after a time interval.
* With the other debug levels you get to click the "flash message" to continue.
*
*/
define('DEBUG', 1);
DEBUG定数に設定する値は、
DEBUG値「0」は本番用。エラー出力なし
DEBUG値に
PHPでは、
なお、
本番環境では通常、
DEBUG値「1」は通常の開発用。エラー出力あり
DEBUG値に
また、
<!-- 0.079s -->
この実行時間出力は、
幸いなことに、
if (Configure::read() > 0) {
echo "<!-- " . round(getMicrotime() - $TIME_START, 4) . "s -->";
}
デフォルトのDEBUG値はこの
DEBUG値「2」はDBへのクエリーのデバッグ情報が出力される
DEBUG値
Nr | Query | Error | Affected | Num. rows | Took (ms) |
---|---|---|---|---|---|
1 | DESCRIBE `tasks` | 5 | 5 | 1 | |
2 | SELECT `Task`.`id`, `Task`.`content`, `Task`.`status`, `Task`.`created`, `Task`.`modified` FROM `tasks` AS `Task` WHERE `Task`.`status` = 'yet' ORDER BY `Task`.`created` ASC | 3 | 3 | 0 | |
3 | SELECT `Task`.`id`, `Task`.`content`, `Task`.`status`, `Task`.`created`, `Task`.`modified` FROM `tasks` AS `Task` WHERE `Task`.`status` = 'done' ORDER BY `Task`.`modified` DESC | 1 | 1 | 0 |
この情報の各カラムの意味は以下のとおりです。
- 「* queries took * ms」
実行したクエリの数と、 合計時間です。 - 「Nr」
実行したクエリーの連番です。 - 「Query」
実行したSQL文です。 - 「Error」
クエリがエラーだった場合、 エラー情報が入ります。 - 「Affected」
UPDATEやDELETEの際は、 影響した行数が入ります。 SELECTの場合は結果の行数です。 - 「Nom. rows」
結果の行数です。 - 「Took (ms)」
DB上でのクエリの実行時間と考えて差し支えありませんが、 CakePHPコア内の処理時間の一部も含まれるため、 DB上での実行時間だけとは限りません。APCなどのPHPアクセラレータを導入した際にこの値が短縮されることがあります。
このようにクエリの合計時間とクエリ1つ1つについての情報が列挙されるので、
個人的にはこの出力はCakePHPの目玉機能の1つではないかと思います。
DEBUG値「3」はコントローラーのオブジェクトを出力する
DEBUG値
たとえば、
Controller dump:
TasksController Object
(
[name] => Tasks
[uses] => Array
(
[0] => Task
)
[helpers] => Array
(
[0] => Javascript
[1] => Ajax
[2] => Html
)
[here] => /todo/tasks
[webroot] => /todo/
[action] => index
[params] => Array
(
[pass] => Array
(
)
[controller] => tasks
[action] => index
[form] => Array
(
)
[url] => Array
(
[url] => tasks
)
[bare] => 0
[webservices] =>
[plugin] =>
)
…
以下延々とコントローラのオブジェクトに設定されている値が出力されます。情報が多すぎてちょっと見づらいので、
DEBUG値を動的に変更する
DEBUG値によるデバッグ情報出力は非常に便利ですが、
Configure::write() で変更する
DEBUG値を変更したい時点で、
たとえば、
ただし、
Configure::write('debug', DEBUG ? 1 : 0)
三項演算子を使用し、
隠しパラメータなどで変更する
GETでのアクセスに限りますが、
app/
define('DEBUG', isset($_GET['debug']) ? $_GET['debug'] : 0);
こうして
そこで、
define('DEBUG', isset($_GET['debug']) &&
preg_match('/^192\./', $_SERVER['REMOTE_ADDR']) ? $_GET['debug'] : 0);
開発環境がLAN内ではなくWAN先で、
その他にもアイデアいろいろ。基本は同一のコードで
その他にも、