アプリケーションのデバッグ

var_dump の置き換え

XDebug と優れた IDE を使用することはアプリケーションのデバッグに不可欠ですが、時には簡単な var_dump() で十分な場合があります。CodeIgniter は、優れた PHP デバッグツールである Kint をバンドルすることで、これをさらに改善しています。これは通常のツールをはるかに超えて、タイムスタンプを認識可能な日付にフォーマットしたり、16 進コードを色で表示したり、配列データをテーブルのように表示して読みやすくしたりするなど、多くの代替データを提供します。

Kint の有効化

デフォルトでは、Kint は**開発**および**テスト**環境でのみ有効になっています。定数 CI_DEBUG が定義され、その値が真の場合に有効になります。これはブートファイル(例: **app/Config/Boot/development.php**)で定義されています。

Kint の使用

d()

d() メソッドは、唯一のパラメーターとして渡されたコンテンツについて知っているすべてのデータを画面にダンプし、スクリプトの実行を継続できるようにします。

<?php

d($_SERVER);

dd()

このメソッドは d() と同じですが、 die() も実行され、このリクエストではそれ以上のコードは実行されません。

trace()

これは、Kint 独自のユニークなスピンで、現在の実行ポイントへのバックトレースを提供します。

<?php

trace();

詳細については、Kint のページを参照してください。

デバッグツールバー

デバッグツールバーは、ベンチマーク結果、実行されたクエリ、リクエストとレスポンスデータなど、現在のページリクエストに関する情報を一目で確認できます。これは、デバッグと最適化に役立つため、開発中に非常に役立ちます。

注意

デバッグツールバーはまだ開発中で、計画されている機能のいくつかはまだ実装されていません。

ツールバーの有効化

ツールバーは、**本番**環境**を除く**すべての環境でデフォルトで有効になっています。定数 CI_DEBUG が定義され、その値が真の場合に表示されます。これはブートファイル(例: **app/Config/Boot/development.php**)で定義されており、そこで変更して表示する環境を決定できます。

注意

baseURL 設定(**app/Config/App.php** または **.env** の app.baseURL)が実際の URL と一致しない場合、デバッグツールバーは表示されません。

ツールバー自体は後フィルターとして表示されます。**app/Config/Filters.php** の $globals プロパティから削除することで、実行を停止できます。

表示内容の選択

CodeIgniter には、その名前が示すように、ツールバーに表示するデータを収集するコレクターがいくつか付属しています。ツールバーをカスタマイズするために、独自のコレクターを簡単に作成できます。表示されるコレクターを決定するには、**app/Config/Toolbar.php** 設定ファイルに戻ります。

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

class Toolbar extends BaseConfig
{
    public $collectors = [
        \CodeIgniter\Debug\Toolbar\Collectors\Timers::class,
        \CodeIgniter\Debug\Toolbar\Collectors\Database::class,
        \CodeIgniter\Debug\Toolbar\Collectors\Logs::class,
        \CodeIgniter\Debug\Toolbar\Collectors\Views::class,
        \CodeIgniter\Debug\Toolbar\Collectors\Cache::class,
        \CodeIgniter\Debug\Toolbar\Collectors\Files::class,
        \CodeIgniter\Debug\Toolbar\Collectors\Routes::class,
        \CodeIgniter\Debug\Toolbar\Collectors\Events::class,
    ];
    // ...
}

表示したくないコレクターはコメントアウトします。完全修飾クラス名を提供することで、ここにカスタムコレクターを追加します。ここに表示されるコレクターは、表示されるタブと、タイムラインに表示される情報に影響します。

注意

データベースやログなどの一部のタブは、表示するコンテンツがある場合にのみ表示されます。それ以外の場合、小さなディスプレイで表示するために削除されます。

CodeIgniter に付属のコレクターは次のとおりです。

  • **タイマー** システムとアプリケーションの両方によるベンチマークデータをすべて収集します。

  • **データベース** すべてのデータベース接続が実行したクエリのリストと、それらの実行時間を表示します。

  • **ログ** ログに記録されたすべての情報がここに表示されます。長時間実行されるシステム、または多くの項目がログに記録されるシステムでは、メモリの問題が発生する可能性があるため、無効にする必要があります。

  • **ビュー** タイムラインにビューのレンダリング時間を表示し、別のタブにビューに渡されたデータを表示します。

  • **キャッシュ** キャッシュのヒットとミス、および実行時間に関する情報を表示します。

  • **ファイル** このリクエスト中にロードされたすべてのファイルのリストを表示します。

  • **ルート** 現在のルートとシステムで定義されているすべてのルートに関する情報を表示します。

  • **イベント** このリクエスト中にロードされたすべてのイベントのリストを表示します。

ベンチマークポイントの設定

プロファイラーがベンチマークデータをコンパイルして表示するには、特定の構文を使用してマークポイントに名前を付ける必要があります。

ベンチマークポイントの設定に関する情報は、ベンチマークライブラリページをご覧ください。

カスタムコレクターの作成

カスタムコレクターの作成は簡単な作業です。 CodeIgniter\Debug\Toolbar\Collectors\BaseCollector を拡張する新しいクラスを作成します。これは、オーバーライドできる多くのメソッドを提供し、コレクターの動作方法に応じて正しく設定する必要がある4つの必須クラスプロパティがあります。

<?php

namespace MyNamespace;

use CodeIgniter\Debug\Toolbar\Collectors\BaseCollector;

class MyCollector extends BaseCollector
{
    protected $hasTimeline = false;

    protected $hasTabContent = false;

    protected $hasVarData = false;

    protected $title = '';
}

**$hasTimeline** は、ツールバーのタイムラインに情報を表示したいコレクターに対して true に設定する必要があります。これが true の場合、表示用のデータをフォーマットして返すために formatTimelineData() メソッドを実装する必要があります。

**$hasTabContent** は、コレクターがカスタムコンテンツを含む独自のタブを表示したい場合に true にする必要があります。これが true の場合、$title を提供し、タブのコンテンツをレンダリングする display() メソッドを実装し、タブコンテンツのタイトルのすぐ右に追加情報を表示したい場合は getTitleDetails() メソッドを実装する必要がある場合があります。

**$hasVarData** は、このコレクターが**Vars**タブに追加データを

**$title** は開いているタブに表示されます。

ツールバータブの表示

ツールバータブを表示するには、次の手順を実行する必要があります。

  1. $title に、ツールバーのタイトルとタブヘッダーの両方として表示されるテキストを入力します。

  2. $hasTabContenttrue に設定します。

  3. display() メソッドを実装します。

  4. オプションで、getTitleDetails() メソッドを実装します。

display() は、タブ自体の中に表示されるHTMLを作成します。タブのタイトルについては、ツールバーによって自動的に処理されるため、考慮する必要はありません。HTMLの文字列を返します。

getTitleDetails() メソッドは、タブのタイトルのすぐ右側に表示される文字列を返します。これは、追加の概要情報を提供するために使用できます。たとえば、データベースタブにはすべてのコネクションの合計クエリ数が表示され、ファイルタブにはファイルの総数が表示されます。

タイムラインデータの提供

タイムラインに表示される情報を提供するには、以下を行う必要があります。

  1. $hasTimelinetrue に設定します。

  2. formatTimelineData() メソッドを実装します。

formatTimelineData() メソッドは、タイムラインが正しくソートして正しい情報を表示するために使用できる形式で、配列の配列を返す必要があります。内部の配列には、以下の情報が含まれている必要があります。

<?php

$data[] = [
    'name'      => '',     // Name displayed on the left of the timeline
    'component' => '',     // Name of the Component listed in the middle of timeline
    'start'     => 0.00,   // start time, like microtime(true)
    'duration'  => 0.00,   // duration, like mircrotime(true) - microtime(true)
];

変数の提供

Varsタブにデータを追加するには、以下を行う必要があります。

  1. $hasVarDatatrue に設定します。

  2. getVarData() メソッドを実装します。

getVarData() メソッドは、表示するキーと値のペアの配列を含む配列を返す必要があります。 外側の配列のキーの名前は、Varsタブのセクションの名前です。

<?php

$data = [
    'section 1' => [
        'foo' => 'bar',
        'bar' => 'baz',
    ],
    'section 2' => [
        'foo' => 'bar',
        'bar' => 'baz',
    ],
];

ホットリロード

バージョン 4.4.0 での新機能。

デバッグツールバーには、ホットリロードと呼ばれる機能が含まれています。この機能を使用すると、アプリケーションのコードを変更し、ページを更新することなくブラウザで自動的にリロードできます。これは、開発中の時間を大幅に節約できます。

開発中にホットリロードを有効にするには、ツールバーの左側にある更新アイコンのようなボタンをクリックします。 これにより、無効にするまで、すべてのページでホットリロードが有効になります。

ホットリロードは、**app** ディレクトリ内のファイルを1秒ごとにスキャンして変更を探します。変更が見つかった場合は、ブラウザにページをリロードするメッセージを送信します。 他のディレクトリはスキャンされないため、**app** ディレクトリ以外のファイルに変更を加えた場合は、手動でページを更新する必要があります。

**app** ディレクトリ以外のファイルを監視する必要がある場合、またはプロジェクトのサイズが原因で速度が遅い場合は、**app/Config/Toolbar.php** 設定ファイルの $watchedDirectories および $watchedExtensions プロパティで、スキャンするディレクトリとスキャンするファイル拡張子を指定できます。