Zend_Db_Profiler没有记录数据库连接时间?

时间:2010-03-01 02:06:45

标签: zend-framework zend-db

按照http://framework.zend.com/manual/en/zend.db.profiler.html上的示例代码,我已经设置了我的Zend Framework应用程序的db分析。

的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";

它适用于select / insert / update / delete查询。

但我无论如何都无法找到探查器来显示启动实际数据库连接所花费的时间,尽管文档暗示它会记录下来。

我怀疑Zend_Db根本没有使用探查器记录与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中?

1 个答案:

答案 0 :(得分:0)

探查器“捆绑”连接和其他操作与一般查询。

您可以通过三种方式专门检查连接:

  1. 在设置过程中在Profiler上设置过滤器:

    $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();
       } 
    }
    
  4. 你在那里找不到很棒的细节,它只是作为一个'连接'操作记录下来的。