CakePHPで高速Webアプリ開発

第11回 CakePHPの「DEBUG値」を極める!

この記事を読むのに必要な時間:およそ 3 分

DEBUG値「3」はコントローラーのオブジェクトを出力する

DEBUG値「3」は,DEBUG値「2」をベースに,CakePHPのコントローラーのオブジェクトを出力します。この値だけは設定するだけでは出力されず,レイアウトかビューに「<?php echo $cakeDebug; ?>」と記述する必要があります。

たとえば,本連載で作成したToDoアプリケーションでDEBUG値を「3」に設定し,レイアウトかビューに「<?php echo $cakeDebug; ?>」を記述すると,以下のように出力されます。

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値によるデバッグ情報出力は非常に便利ですが,Ajax処理やJSONデータの受け渡しなどでデバッグ出力が邪魔になることがあります。そのたびに app/config/core.php を書き換えるのは少々面倒なので,効率的にDEBUG値を変更する手法を紹介します。

Configure::write() で変更する

DEBUG値を変更したい時点で,⁠Configure::write('debug', DEBUG値);」を実行すると,その時点からDEBUG値が変更されます。

たとえば,開発中のDEBUG値が2のとき,特定のアクションだけDBのデバッグ出力をなくしたいときがあります。そんなときはそのアクション内で「Configure::write('debug', 1);」と書けば,DEBUG値は「1」に設定されます。

ただし,開発中のコードが誤ってそのまま本番に反映されてしまうと,app/config/core.php で設定したDEBUG値が「0」でも,特定のアクションでPHPエラーが出力されてしまうなどの問題が発生します。そこでお勧めなのが,以下の書き方です。

Configure::write('debug', DEBUG ? 1 : 0)

三項演算子を使用し,DEBUG定数が真(今回のケースでは2か3を想定)のときのみ1が設定されます。偽(今回のケースでは0)のときは0が設定され,本番用の設定が保たれます。

隠しパラメータなどで変更する

GETでのアクセスに限りますが,隠しパラメータなどでDEBUG値を動的に設定するのも良いでしょう。

app/config/core.phpでDEBUG定数を設定している部分を,以下のように書き換えます。

app/webroot/index.php

define('DEBUG', isset($_GET['debug']) ? $_GET['debug'] : 0);

こうして「http://example.com/cakeapp/?debug=2」といったURLでアクセスすること,DEBUG値を設定できます。ただし,このコードがそのまま本番環境に反映された場合,誰でもdebug値の変更が可能になってしまいますので,かなり危険です。かといって開発環境と本番環境で app/config/core.php を書き換えていては,本末転倒です。

そこで,たとえば,LAN内からアクセスされた場合のみ変更可能するなどの制限を加えるなどが有効です。以下のコードはクライアントのIPアドレスが「192.」から始まる場合の例です。

app/webroot/index.php

define('DEBUG', isset($_GET['debug']) &&
  preg_match('/^192\./', $_SERVER['REMOTE_ADDR']) ? $_GET['debug'] : 0);

開発環境がLAN内ではなくWAN先で,アクセス元が固定IPの場合は,そのIPアドレスのみ許可する形式でも良いでしょう。

その他にもアイデアいろいろ。基本は同一のコードで

その他にも,Cookieを使ったり,サーバの環境変数を使ったりするなど,さまざまな手法があります。基本方針としては,開発環境でも本番環境でもなるべくアプリケーションのコードを同一にすることです。誤ってアップロードしたりコミットしたりというのは,どんなに注意していても必ず起きます。人間は必ずミスをする生き物ということを前提に,快適にデバッグできるように工夫すると良いでしょう。

著者プロフィール

秋田真宏(あきたまさひろ)

株式会社ロケットスタート エンジニア。個人ブログは「akiyan.com」。1981年生まれ。

URLhttp://www.akiyan.com/

著書