0

http://framework.zend.com/manual/en/zend.db.profiler.htmlのサンプル コードに従って、Zend Framework アプリのデータベース プロファイリングをセットアップしました。

アプリケーション.ini:

db.profiler.enabled = true

ビュー ヘルパー:

$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 'Executed ' . $queryCount . ' queries in ' . $totalTime . ' seconds' . "\n";
echo 'Average query length: ' . $totalTime / $queryCount . ' seconds' . "\n";
echo 'Queries per second: ' . $queryCount / $totalTime . "\n";
echo 'Longest query length: ' . $longestTime . "\n";
echo "Longest query: \n" . $longestQuery . "\n";

選択/挿入/更新/削除クエリでは問題なく機能します。

しかし、プロファイラーが実際のデータベース接続を開始するのにかかった時間を表示する方法をとにかく見つけることができません。

Zend_Db は、プロファイラーを使用して db への接続を単にログに記録していないと思われます。

ここで何が起こっているか知っている人はいますか?

Oracle データベース アダプタと ZF 1.10.1 を使用しています。

アップデート:

プロファイラーの出力をフィルタリングして、select/insert/update などの特定のクエリ タイプのみを表示できることを理解しています。接続レコードのみをフィルタリングするオプションもあるようです。

$profiler->setFilterQueryType(Zend_Db_Profiler::CONNECT);

ただし、私の問題は、プロファイラーが最初から接続をログに記録していないため、このフィルターは何もしないことです。

プロファイラーオブジェクトを出力すると、さまざまなクエリのデータが含まれますが、接続クエリのデータは含まれないため、これは事実です。

print_r($profiler);
//出力
Zend_Db_Profiler オブジェクト
(
    [_queryProfiles:protected] => 配列
        (
            [0] => Zend_Db_Profiler_Query オブジェクト
                (
                    [_query:protected] => select * from table1
                    [_queryType:保護] => 32
                    [_startedMicrotime:保護] => 1268104035.3465
                    [_endedMicrotime:保護] => 1268104035.3855
                    [_boundParams:protected] => 配列
                        (
                        )

                )

            [1] => Zend_Db_Profiler_Query オブジェクト
                (
                    [_query:protected] => select * from table2
                    [_queryType:保護] => 32
                    [_startedMicrotime:保護] => 1268104035.3882
                    [_endedMicrotime:保護] => 1268104035.419
                    [_boundParams:protected] => 配列
                        (
                        )

                )

        )

    [_enabled:保護] => 1
    [_filterElapsedSecs:保護] =>
    [_filterTypes:保護] =>
)

何か間違ったことをしていますか? それとも、接続のログ記録がまだ Zend Framework に追加されていないのでしょうか?

4

1 に答える 1

0

プロファイラーは、接続およびその他の操作を一般的なクエリにバンドルします。

接続を具体的に調べる方法は3つあります。

  1. セットアップ中にプロファイラーにフィルターを設定します。

    $profiler->setFilterQueryType(**Zend_Db_Profiler::CONNECT**);
    

    その場合、結果のプロファイルには「接続」操作のみが含まれます。

  2. クエリプロファイルを取得するときにクエリタイプを指定します。

    $profiles = $profiler->getQueryProfiles(**Zend_Db_Profiler::CONNECT**);
    
  3. 反復中にクエリオブジェクトを直接調べます。

    foreach($profiler->getQueryProfiles() as $query) {
    if ($query->getQueryType() == Zend_Db_Profiler::CONNECT &&
       $query->getElapsedSecs() > $longestConnectionTime) {
           $longestConnectionTime  = $query->getElapsedSecs();
       } 
    }
    

そこには詳細はありません。「接続」操作として、所要時間とともにログに記録されます。

于 2010-03-05T17:11:28.657 に答える