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 に追加されていないのでしょうか?