Zend_Db_Profiler не регистрирует время соединения БД? - PullRequest
0 голосов
/ 01 марта 2010

Следуя примеру кода на http://framework.zend.com/manual/en/zend.db.profiler.html Я настроил профилирование базы данных моего приложения Zend Framework.

application.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 просто не регистрирует соединение с БД с помощью профилировщика.

Кто-нибудь знает, что здесь происходит?

Я использую адаптер базы данных Oracle и ZF 1.10.1

UPDATE:

Я понимаю, что возможно отфильтровать выходные данные профилировщика, так что он будет показывать только определенные типы запросов, например выберите / вставки / обновления. Также существует возможность отфильтровать только записи о соединении:

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

Однако моя проблема в том, что профилировщик не регистрирует соединения для начала с , поэтому этот фильтр ничего не делает.

Я знаю это точно, потому что, если я распечатываю объект профилировщика, он содержит данные для множества разных запросов, но не содержит данных для запросов на соединение:

print_r($profiler);
//output
Zend_Db_Profiler Object
(
    [_queryProfiles:protected] => Array
        (
            [0] => Zend_Db_Profiler_Query Object
                (
                    [_query:protected] => select * from table1
                    [_queryType:protected] => 32
                    [_startedMicrotime:protected] => 1268104035.3465
                    [_endedMicrotime:protected] => 1268104035.3855
                    [_boundParams:protected] => Array
                        (
                        )

                )

            [1] => Zend_Db_Profiler_Query Object
                (
                    [_query:protected] => select * from table2
                    [_queryType:protected] => 32
                    [_startedMicrotime:protected] => 1268104035.3882
                    [_endedMicrotime:protected] => 1268104035.419
                    [_boundParams:protected] => Array
                        (
                        )

                )

        )

    [_enabled:protected] => 1
    [_filterElapsedSecs:protected] => 
    [_filterTypes:protected] => 
)

Я что-то не так делаю - или логирование соединений просто еще не добавлено в Zend Framework?

1 Ответ

0 голосов
/ 05 марта 2010

Профилировщик 'связывает' соединение и другие операции с общими запросами.

Есть три способа, которыми вы могли бы специально изучить соединение:

  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();
       } 
    }
    

Вы не найдете там больших подробностей, они регистрируются просто как операция 'connect' вместе с затраченным временем.

...