Zend_Db_Profiler не регистрирует время подключения к базе данных?

Следуя образцу кода на 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

ОБНОВЛЕНИЕ:

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

$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 еще не добавлено ведение журнала подключений?


person asgeo1    schedule 01.03.2010    source источник


Ответы (1)


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

Есть три способа конкретно проверить соединение:

  1. # P3 #
    $profiler->setFilterQueryType(**Zend_Db_Profiler::CONNECT**);
    
    # P4 #
  2. # P5 #
    $profiles = $profiler->getQueryProfiles(**Zend_Db_Profiler::CONNECT**);
    
  3. # P6 #
    foreach($profiler->getQueryProfiles() as $query) {
    if ($query->getQueryType() == Zend_Db_Profiler::CONNECT &&
       $query->getElapsedSecs() > $longestConnectionTime) {
           $longestConnectionTime  = $query->getElapsedSecs();
       } 
    }
    

Вы не найдете там подробностей, они регистрируются как операция «подключения» вместе с затраченным временем.

person Simon Christian    schedule 05.03.2010
comment
Это моя проблема - у меня это не работает! В журнале нет записей о подключениях, поэтому фильтровать нечего. Я постараюсь обновить свой вопрос, чтобы дать больше информации по этому поводу. - person asgeo1; 09.03.2010
comment
Кажется, что адаптер Oracle не выполняет соответствующих вызовов профилировщику для подключения. Сравнивая методы _connect () в Zend_Db_Adapter_Pdo_Abstract и Zend_Db_Adapter_Oracle, перед созданием соединения предыдущие вызовы: $ q = $ this - ›_ profiler-› queryStart ('connect', Zend_Db_Profiler :: CONNECT); а затем: $ this - ›_ profiler-› queryEnd ($ q); Адаптер Oracle не имеет ссылки на профилировщик (по крайней мере, до версии 1.10.2), но я полагаю, что это может быть так же просто, как добавить эквивалентные вызовы в метод _connect (). - person Simon Christian; 09.03.2010