Zend_Db_Profiler(日本語)導入Zend_Db_Profiler を使用すると、クエリの情報を取得できます。 アダプタが実際に実行したクエリの内容や実行所要時間などが取得でき、 余計なデバッグコードをクラスに追加しなくてもクエリを調べられるようになります。 さらに、条件を指定して特定のクエリだけの情報を取得することもできます。 プロファイラを有効にするには、アダプタのコンストラクタで指定するか、 あるいは後からアダプタに指示します。
profiler オプションの値には柔軟性があり、 その型に応じて、さまざまな形式で解釈されます。 たいていは単純な boolean 値を指定することになるでしょうが、 その他の型を指定することでプロファイラの振る舞いをカスタマイズすることも可能です。 boolean 引数 TRUE を指定すると、 プロファイラを有効にします。あるいは FALSE にすると、プロファイラを無効にします。プロファイラのクラスは、 そのアダプタのデフォルトのプロファイラクラスである Zend_Db_Profiler となります。
プロファイラオブジェクトのインスタンスを、アダプタで使用します。 このオブジェクトの型は、Zend_Db_Profiler あるいはそのサブクラスでなければなりません。 プロファイラを有効にするには、次にようにします。
引数は連想配列で、'enabled'、 'instance' および 'class' のいずれか (あるいはすべて) のキーを持ちます。 'enabled' と 'instance' は、 それぞれ boolean および上で説明したインスタンスです。 'class' は、独自のプロファイラを使用する場合のクラス名を指定します。 このクラスは Zend_Db_Profiler あるいはそのサブクラスでなければなりません。 このクラスは、コンストラクタに何も引数を渡さないでインスタンス化されます。 'class' の内容は、 'instance' を指定した際には無視されます。
また、引数は Zend_Config のオブジェクトで渡すこともできます。 このオブジェクトのプロパティが、先ほどの連想配列のキーと同じように解釈されます。 たとえば、次のような内容の "config.ini" ファイルがあったとしましょう。
この設定を適用するには、次のような PHP コードを書きます。
'instance' プロパティは、次のように使用します。
プロファイラの使用好きなところでアダプタの getProfiler() メソッドを使用すれば、 プロファイラを取得できます。 これは、Zend_Db_Profiler オブジェクトのインスタンスを返します。 このインスタンスのさまざまなメソッドを使用することで、 クエリの内容を調べることができます。
getLastQueryProfile() の返り値、および getQueryProfiles() の個々の要素は Zend_Db_Profiler_Query オブジェクトで、 これを使用すると個々のクエリ自体の情報を調べられます。
Zend_Db_Profiler の提供する情報は、 アプリケーションのボトルネックを調査したり クエリをデバッグしたりする場合に有用です。 例えば、直近に実行されたクエリが実際のところどんなものだったのかを知るには次のようにします。 ページの生成に時間がかかっているとしましょう。この場合、 プロファイラを使用してまず全クエリの実行所要秒数を取得します。 それから、個々のクエリを調べ、一番時間がかかっているのはどれかを見つけます。
プロファイラの高度な使用法単にクエリを調べるだけでなく、どのクエリを調べるのかという 条件を指定することも可能です。以下で説明するメソッドは、 Zend_Db_Profiler インスタンスのメソッドです。 クエリの実行所要時間による絞り込みsetFilterElapsedSecs() は、クエリの情報を取得する条件として 実行所要時間の最小値を指定します。このフィルタを削除するには、 メソッドに NULL 値を渡します。
クエリの形式による絞り込みsetFilterQueryType() は、クエリの情報を取得する条件として クエリの形式を指定します。複数の形式を扱うには、それらの論理 OR を指定します。 クエリの形式は、Zend_Db_Profiler のクラス定数として以下のように定義されています。
既存のフィルタを削除するには、 setFilterElapsedSecs() の引数に NULL だけを渡します。
クエリの型を指定することによる情報の取得setFilterQueryType() を使用すると、 生成される情報を減らすことができます。 すべての情報を保持しておくほうがよい場合もありますが、 普通はそのときに必要な情報のみが見られればよいでしょう。 getQueryProfiles() のもうひとつの機能として、 最初の引数にクエリの型 (あるいは複数の型の論理和) を指定することによるその場での絞り込みが可能です。 クエリの型を表す定数については この節 を参照ください。
特化型のプロファイラ特化型のプロファイラは Zend_Db_Profiler を継承したオブジェクトです。 プロファイリング情報を特別な方法で処理します。 Firebug によるプロファイリングZend_Db_Profiler_Firebug は、プロファイリング情報を » Firebug » コンソール に送信します。 すべてのデータの送信には Zend_Wildfire_Channel_HttpHeaders コンポーネントを使用します。これは HTTP ヘッダを使用するので、 ページのコンテンツには何も影響を及ぼしません。 この方式なら、AJAX リクエストのようにクリーンな JSON および XML レスポンスを要求するリクエストのデバッグも行えます。 要件:
Example #1 Zend_Controller_Front を使った DB のプロファイリング
Example #2 Zend_Controller_Front を使わない DB のプロファイリング
|