Previous Next

Zend_Db_Profiler

導入

Zend_Db_Profiler を使用すると、クエリの情報を取得することができます。 アダプタが実際に実行したクエリの内容や実行所要時間などが取得でき、 余計なデバッグコードをクラスに追加しなくてもクエリを調べられるようになります。 さらに、条件を指定して特定のクエリだけの情報を取得することもできます。

プロファイラを有効にするには、アダプタのコンストラクタで指定するか、 あるいは後からアダプタに指示します。

$params = array(
    'host'     => '127.0.0.1',
    'username' => 'webuser',
    'password' => 'xxxxxxxx',
    'dbname'   => 'test'
    'profiler' => true  // プロファイラを使用します。
                        // false (デフォルト) にすると無効になります。
);

$db = Zend_Db::factory('PDO_MYSQL', $params);

// プロファイラを無効にします
$db->getProfiler()->setEnabled(false);

// プロファイラを有効にします
$db->getProfiler()->setEnabled(true);

profiler オプションの値には柔軟性があり、 その型に応じて、さまざまな形式で解釈されます。 たいていは単純な boolean 値を指定することになるでしょうが、 その他の型を指定することでプロファイラの振る舞いをカスタマイズすることも可能です。

boolean 引数 TRUE を指定すると、 プロファイラを有効にします。あるいは FALSE にすると、プロファイラを無効にします。プロファイラのクラスは、 そのアダプタのデフォルトのプロファイラクラスである Zend_Db_Profiler となります。

$params['profiler'] = true;
$db = Zend_Db::factory('PDO_MYSQL', $params);

プロファイラオブジェクトのインスタンスを、アダプタで使用します。 このオブジェクトの型は、Zend_Db_Profiler あるいはそのサブクラスでなければなりません。 プロファイラを有効にするには、次にようにします。

$profiler = MyProject_Db_Profiler();
$profiler->setEnabled(true);
$params['profiler'] = $profiler;
$db = Zend_Db::factory('PDO_MYSQL', $params);

引数は連想配列で、'enabled'、 'instance' および 'class' のいずれか (あるいはすべて) のキーを持ちます。 'enabled' と 'instance' は、 それぞれ boolean および上で説明したインスタンスです。 'class' は、独自のプロファイラを使用する場合のクラス名を指定します。 このクラスは Zend_Db_Profiler あるいはそのサブクラスでなければなりません。 このクラスは、コンストラクタに何も引数を渡さないでインスタンス化されます。 'class' の内容は、 'instance' を指定した際には無視されます。

$params['profiler'] = array(
    'enabled' => true,
    'class'   => 'MyProject_Db_Profiler'
);
$db = Zend_Db::factory('PDO_MYSQL', $params);

また、引数は Zend_Config のオブジェクトで渡すこともできます。 このオブジェクトのプロパティが、先ほどの連想配列のキーと同じように解釈されます。 たとえば、次のような内容の "config.ini" ファイルがあったとしましょう。

[main]
db.profiler.class   = "MyProject_Db_Profiler"
db.profiler.enabled = true
この設定を適用するには、次のような PHP コードを書きます。
$config = new Zend_Config_Ini('config.ini', 'main');
$params['profiler'] = $config->db->profiler;
$db = Zend_Db::factory('PDO_MYSQL', $params);
'instance' プロパティは、次のように使用します。
$profiler = new MyProject_Db_Profiler();
$profiler->setEnabled(true);
$configData = array(
    'instance' => $profiler
    );
$config = new Zend_Config($configData);
$params['profiler'] = $config;
$db = Zend_Db::factory('PDO_MYSQL', $params);

プロファイラの使用

好きなところでアダプタの getProfiler() メソッドを使用すれば、 プロファイラを取得できます。

$profiler = $db->getProfiler();

これは、Zend_Db_Profiler オブジェクトのインスタンスを返します。 このインスタンスのさまざまなメソッドを使用することで、 クエリの内容を調べることができます。

  • getTotalNumQueries() は、 情報を取得したクエリの総数を返します。

  • getTotalElapsedSecs() は、 情報を取得したクエリの実行所要時間の合計を返します。

  • getQueryProfiles() は、 すべてのクエリ情報を配列で返します。

  • getLastQueryProfile() は、最後に (直近に) 実行されたクエリの情報を (そのクエリが 完了したか否かにかかわらず) 返します (クエリが完了していない場合は、終了時刻が null となります)。

  • clear() は、スタック上に残っている 過去のクエリ情報をすべて消去します。

getLastQueryProfile() の返り値、および getQueryProfiles() の個々の要素は Zend_Db_Profiler_Query オブジェクトで、 これを使用すると個々のクエリ自体の情報を調べられます。

  • getQuery() は、クエリの SQL テキストを返します。 パラメータつきのプリペアドステートメントの場合、 クエリがプリペアされた時点のテキストを返します。 つまり、プレースホルダを含んだままの形式ということです。 実行時に置き換えられた値を知ることはできません。

  • getQueryParams() は、 プリペアドクエリを実行する際に使用する、パラメータの値の配列を返します。 ここには、バインドパラメータだけでなく execute() メソッドへの引数も含まれます。 配列のキーは、(1 から始まる) 数値かあるいは (文字列の) パラメータ名となります。

  • getElapsedSecs() は、 クエリの実行所要時間を返します。

Zend_Db_Profiler の提供する情報は、 アプリケーションのボトルネックを調査したり クエリをデバッグしたりする場合に有用です。 例えば、直近に実行されたクエリが実際のところどんなものだったのかを知るには次のようにします。

$query = $profiler->getLastQueryProfile();

echo $query->getQuery();

ページの生成に時間がかかっているとしましょう。この場合、 プロファイラを使用してまず全クエリの実行所要秒数を取得します。 それから、個々のクエリを調べ、一番時間がかかっているのはどれかを見つけます。

$totalTime    = $profiler->getTotalElapsedSecs();
$queryCount   = $profiler->getTotalNumQueries();
$longestTime  = 0;
$longestQuery = null;

foreach ($profiler->getQueryProfiles() as $query) {
    if ($query->getElapsedSecs() > $longestTime) {
        $longestTime  = $query->getElapsedSecs();
        $longestQuery = $query->getQuery();
    }
}

echo '全部で ' . $queryCount . ' 件のクエリが ' . $totalTime .
     ' 秒で実行されました' . "\n";
echo '平均の所要時間: ' . $totalTime / $queryCount . ' 秒' . "\n";
echo '1 秒あたりのクエリ実行数: ' . $queryCount / $totalTime . "\n";
echo '所要時間の最大値: ' . $longestTime . "\n";
echo "一番時間のかかっているクエリ: \n" . $longestQuery . "\n";

プロファイラの高度な使用法

単にクエリを調べるだけでなく、どのクエリを調べるのかという 条件を指定することも可能です。以下で説明するメソッドは、 Zend_Db_Profiler インスタンスのメソッドです。

クエリの実行所要時間による絞り込み

setFilterElapsedSecs() は、クエリの情報を取得する条件として 実行所要時間の最小値を指定します。このフィルタを削除するには、 メソッドに null 値を渡します。

// 所要時間が 5 秒以上のクエリのみ調べます
$profiler->setFilterElapsedSecs(5);

// 所要時間にかかわらず、すべてのクエリを調べます
$profiler->setFilterElapsedSecs(null);

クエリの形式による絞り込み

setFilterQueryType() は、クエリの情報を取得する条件として クエリの形式を指定します。複数の形式を扱うには、それらの論理 OR を指定します。 クエリの形式は、Zend_Db_Profiler のクラス定数として以下のように定義されています。

  • Zend_Db_Profiler::CONNECT: 接続操作、あるいはデータベースの選択。

  • Zend_Db_Profiler::QUERY: 他の形式にあてはまらないクエリ。

  • Zend_Db_Profiler::INSERT: 新しいデータをデータベースに追加するクエリ。 一般的には SQL の INSERT。

  • Zend_Db_Profiler::UPDATE: 既存のデータを更新するクエリ。通常は SQL の UPDATE。

  • Zend_Db_Profiler::DELETE: 既存のデータを削除するクエリ。通常は SQL の DELETE。

  • Zend_Db_Profiler::SELECT: 既存のデータを取得するクエリ。通常は SQL の SELECT。

  • Zend_Db_Profiler::TRANSACTION: トランザクションに関する操作。例えばトランザクションの開始や コミット、ロールバックなど。

既存のフィルタを削除するには、 setFilterElapsedSecs() の引数に NULL だけを渡します。

// SELECT クエリのみを調べます
$profiler->setFilterQueryType(Zend_Db_Profiler::SELECT);

// SELECT、INSERT そして UPDATE クエリを調べます
$profiler->setFilterQueryType(Zend_Db_Profiler::SELECT |
                              Zend_Db_Profiler::INSERT |
                              Zend_Db_Profiler::UPDATE);

// DELETE クエリを調べます
$profiler->setFilterQueryType(Zend_Db_Profiler::DELETE);

// すべてのフィルタを削除します
$profiler->setFilterQueryType(null);

クエリの型を指定することによる情報の取得

setFilterQueryType() を使用すると、生成される情報を減らすことができます。 すべての情報を保持しておくほうがよい場合もありますが、 普通はそのときに必要な情報のみが見られればよいでしょう。 getQueryProfiles() のもうひとつの機能として、 最初の引数にクエリの型 (あるいは複数の型の論理和) を指定することによるその場での絞り込みが可能です。 クエリの型を表す定数については クエリの形式による絞り込み を参照ください。

// SELECT クエリの情報のみを取得します
$profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT);

// SELECT、INSERT そして UPDATE クエリの情報のみを取得します
$profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT |
                                        Zend_Db_Profiler::INSERT |
                                        Zend_Db_Profiler::UPDATE);

// DELETE クエリの情報を取得します
$profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE);

特化型のプロファイラ

特化型のプロファイラは Zend_Db_Profiler を継承したオブジェクトです。 プロファイリング情報を特別な方法で処理します。

Firebug によるプロファイリング

Zend_Db_Profiler_Firebug は、プロファイリング情報を » Firebug » コンソール に送信します。

すべてのデータの送信には Zend_Wildfire_Channel_HttpHeaders コンポーネントを使用します。これは HTTP ヘッダを使用するので、 ページのコンテンツには何も影響を及ぼしません。 この方式なら、AJAX リクエストのようにクリーンな JSON および XML レスポンスを要求するリクエストのデバッグも行えます。

要件:

Example #1 Zend_Controller_Front を使った DB のプロファイリング

// 起動ファイル

$profiler = new Zend_Db_Profiler_Firebug('All DB Queries');
$profiler->setEnabled(true);

// プロファイラを db アダプタにアタッチします
$db->setProfiler($profiler)

// フロントコントローラをディスパッチします

// モデル、ビューそしてコントローラファイル内で発行されたすべての
// DB クエリのプロファイル結果が Firebug に送信されます

Example #2 Zend_Controller_Front を使わない DB のプロファイリング

$profiler = new Zend_Db_Profiler_Firebug('All DB Queries');
$profiler->setEnabled(true);

// プロファイラを DB アダプタにアタッチします
$db->setProfiler($profiler)

$request  = new Zend_Controller_Request_Http();
$response = new Zend_Controller_Response_Http();
$channel  = Zend_Wildfire_Channel_HttpHeaders::getInstance();
$channel->setRequest($request);
$channel->setResponse($response);

// 出力バッファリングを開始します
ob_start();

// DB クエリを発行すると、それがプロファイリングされます

// データをブラウザに送信します
$channel->flush();
$response->sendHeaders();
Previous Next
Introduction to Zend Framework
概要
インストール
Zend_Acl
導入
アクセス制御の洗練
高度な使用法
Zend_Amf
導入
Zend_Amf_Server
Zend_Application
導入
Zend_Application Quick Start
Theory of Operation
Examples
コア機能
利用できるリソースプラグイン
Zend_Auth
導入
データベースのテーブルでの認証
ダイジェスト認証
HTTP 認証アダプタ
LDAP 認証
Open ID 認証
Zend_Cache
導入
キャッシュの仕組み
Zend_Cache のフロントエンド
Zend_Cache のバックエンド
Zend_Captcha
導入
Captcha の方法
CAPTCHA アダプタ
Zend_CodeGenerator
導入
Zend_CodeGeneratorサンプル
Zend_CodeGeneratorリファレンス
Zend_Config
導入
動作原理
Zend_Config_Ini
Zend_Config_Xml
Zend_Config_Writer
Zend_Config_Writer
Zend_Console_Getopt
導入
Getopt の規則の宣言
オプションおよび引数の取得
Zend_Console_Getopt の設定
Zend_Controller
Zend_Controller クイックスタート
Zend_Controller の基本
フロントコントローラ
リクエストオブジェクト
標準のルータ
ディスパッチャ
アクションコントローラ
アクションヘルパー
レスポンスオブジェクト
プラグイン
モジュラーディレクトリ構造の規約の使用
MVC での例外
以前のバージョンからの移行
Zend_Currency
Zend_Currency について
通貨の操作方法
以前のバージョンからの移行
Zend_Date
導入
動作原理
基本メソッド
Zend_Date API の概要
日付の作成
日付関数全般用の定数
動作例
Zend_Db
Zend_Db_Adapter
Zend_Db_Statement
Zend_Db_Profiler
Zend_Db_Select
Zend_Db_Table
Zend_Db_Table_Row
Zend_Db_Table_Rowset
導入
Zend_Debug
変数の出力
Zend_Dojo
導入
Zend_Dojo_Data: dojo.data エンベロープ
Dojo ビューヘルパー
Dojoフォーム要素とデコレーター
Zend_Dom
導入
Zend_Dom_Query
Zend_Exception
例外の使用法
Zend_Feed
導入
フィードの読み込み
ウェブページからのフィードの取得
RSS フィードの使用
Atom フィードの使用
単一の Atom エントリの処理
フィードおよびエントリの構造の変更
独自のフィードクラスおよびエントリクラス
Zend_File
Zend_File_Transfer
Zend_File_Transfer 用のバリデータ
Filters for Zend_File_Transfer
以前のバージョンからの移行
Zend_Filter
導入
標準のフィルタクラス群
フィルタチェイン
フィルタの書き方
Zend_Filter_Input
Zend_Filter_Inflector
Zend_Form
Zend_Form
Zend_Form クイックスタート
Zend_Form_Element を用いたフォーム要素の作成
Zend_Form によるフォームの作成
Zend_Form_Decorator による独自のフォームマークアップの作成
Zend Framework に同梱されている標準のフォーム要素
Zend Framework に同梱されている標準のデコレータ
Zend_Form の国際化
Zend_Form の高度な使用法
Zend_Gdata
導入
AuthSub による認証
Using the Book Search Data API
ClientLogin による認証
Google Calendar の使用法
Google Documents List Data API の使用法
Using Google Health
Google Spreadsheets の使用法
Google Apps Provisioning の使用法
Google Base の使用法
Picasa Web Albums の使用法
YouTube Data API の使用法
Gdata の例外処理
Zend_Http
導入
Zend_Http_Client - 高度な使用法
Zend_Http_Client - 接続アダプタ
Zend_Http_Cookie および Zend_Http_CookieJar
Zend_Http_Response
Zend_InfoCard
導入
Zend_Json
導入
基本的な使用法
Zend_Json の高度な使用法
XML から JSON への変換
Zend_Json_Server - JSON-RPCサーバー
Zend_Layout
導入
Zend_Layout クイックスタート
Zend_Layout の設定オプション
Zend_Layout の高度な使用法
Zend_Ldap
導入
Zend_Loader
ファイルやクラスの動的な読み込み
The Autoloader
Resource Autoloaders
プラグインのロード
Zend_Locale
導入
Zend_Locale の使用法
正規化および地域化
日付および時刻の扱い
サポートするロケール
以前のバージョンからの移行
Zend_Log
概要
ライター
フォーマッタ
フィルタ
Zend_Mail
導入
SMTP 経由での送信
SMTP 接続による複数のメールの送信
異なる転送手段の使用
HTML メール
ファイルの添付
受信者の追加
MIME バウンダリの制御
追加のヘッダ
文字セット
エンコーディング
SMTP 認証
セキュアな SMTP トランスポート
メールメッセージの読み込み
Zend_Measure
導入
計測値の作成
計測値の出力
計測値の操作
計測値の型
Zend_Memory
概要
メモリマネージャ
メモリオブジェクト
Zend_Mime
Zend_Mime
Zend_Mime_Message
Zend_Mime_Part
Zend_Navigation
Introduction
画面
Containers
Zend_OpenId
導入
Zend_OpenId_Consumer の基本
Zend_OpenId_Provider
Zend_Paginator
導入
使用法
設定
高度な使用法
Zend_Pdf
導入
PDF ドキュメントの作成および読み込み
PDF ドキュメントへの変更内容の保存
ページの操作
描画
ドキュメントの情報およびメタデータ
Zend_Pdf モジュールの使用例
Zend_ProgressBar
Zend_ProgressBar
Zend_Reflection
導入
Zend_Reflectionサンプル
Zend_Reflectionリファレンス
Zend_Registry
レジストリの使用法
Zend_Rest
導入
Zend_Rest_Client
Zend_Rest_Server
Zend_Search_Lucene
概要
インデックスの構築
インデックスの検索
クエリ言語
クエリ作成用の API
文字セット
拡張性
Java Lucene との相互運用
応用
ベストプラクティス
Zend_Server
導入
Zend_Server_Reflection
Zend_Service
導入
Zend_Service_Akismet
Zend_Service_Amazon
Zend_Service_Amazon_Ec2
Zend_Service_Amazon_Ec2: Instances
Zend_Service_Amazon_Ec2: Windows Instances
Zend_Service_Amazon_Ec2: Reserved Instances
Zend_Service_Amazon_Ec2: CloudWatch Monitoring
Zend_Service_Amazon_Ec2: Amazon Machine Images (AMI)
Zend_Service_Amazon_Ec2: Elastic Block Stroage (EBS)
Zend_Service_Amazon_Ec2: Elastic IP Addresses
Zend_Service_Amazon_Ec2: Keypairs
Zend_Service_Amazon_Ec2: Regions and Availability Zones
Zend_Service_Amazon_Ec2: Security Groups
Zend_Service_Amazon_S3
Zend_Service_Audioscrobbler
Zend_Service_Delicious
Zend_Service_Flickr
Zend_Service_Nirvanix
Zend_Service_ReCaptcha
Zend_Service_Simpy
導入
Zend_Service_StrikeIron
Zend_Service_StrikeIron: バンドルされているサービス
Zend_Service_StrikeIron: 応用編
Zend_Service_Technorati
Zend_Service_Twitter
Zend_Service_Yahoo
Zend_Session
導入
基本的な使用法
高度な使用法
グローバルセッションの管理
Zend_Session_SaveHandler_DbTable
Zend_Soap
Zend_Soap_Server
Zend_Soap_Client
WSDLアクセッサ
自動検出
Zend_Tag
Introduction
Zend_Tag_Cloud
Zend_Test
導入
Zend_Test_PHPUnit
Zend_Text
Zend_Text_Figlet
Zend_Text_Table
Zend_TimeSync
導入
Zend_TimeSync の動作
Zend_Tool_Framework
Introduction
Using the CLI Tool
Architecture
Creating Providers to use with Zend_Tool_Framework
Shipped System Providers
Zend_Tool_Project
Zend_Tool_Project導入
Create A Project
Zend Tool Project Providers
Zend_Translate
導入
Zend_Translate のアダプタ
翻訳アダプタの使用法
以前のバージョンからの移行
Zend_Uri
Zend_Uri
Zend_Validate
導入
標準のバリデーションクラス群
バリデータチェイン
バリデータの書き方
検証メッセージ
Zend_Version
Zend Framework のバージョンの取得
Zend_View
導入
コントローラスクリプト
ビュースクリプト
ビューヘルパー
Zend_View_Abstract
以前のバージョンからの移行
Zend_Wildfire
Zend_Wildfire
Zend_XmlRpc
導入
Zend_XmlRpc_Client
Zend_XmlRpc_Server
Zend Framework のシステム要件
導入
Zend Framework PHP 標準コーディング規約
概要
PHP ファイルの書式
命名規約
コーディングスタイル
Zend Framework Performance Guide
導入
クラスの読み込み
Zend_Dbパフォーマンス
国際化(i18n)とローカライズ(l10n)
ビューのレンダリング
著作権に関する情報