【问题标题】:Zend_Db_Profiler not logging db connection time?Zend_Db_Profiler 不记录数据库连接时间?
【发布时间】:2010-03-09 11:21:14
【问题描述】:

按照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 根本没有使用分析器记录与数据库的连接。

有人知道这里发生了什么吗?

我正在使用 Oracle 数据库适配器和 ZF 1.10.1

更新:

我了解可以过滤分析器输出,使其仅显示某些查询类型,例如选择/插入/更新。似乎还有一个选项可以仅过滤连接记录:

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

但是,我的问题是分析器没有记录开始时的连接,所以这个过滤器什么都不做。

我知道这是一个事实,因为如果我打印分析器对象,它包含许多不同查询的数据 - 但没有连接查询的数据:

print_r($profiler);
//输出 Zend_Db_Profiler 对象 ( [_queryProfiles:protected] => 数组 ( [0] => Zend_Db_Profiler_Query 对象 ( [_query:protected] => 从 table1 中选择 * [_queryType:protected] => 32 [_startedMicrotime:protected] => 1268104035.3465 [_endedMicrotime:protected] => 1268104035.3855 [_boundParams:protected] => 数组 ( ) ) [1] => Zend_Db_Profiler_Query 对象 ( [_query:protected] => 从 table2 中选择 * [_queryType:protected] => 32 [_startedMicrotime:protected] => 1268104035.3882 [_endedMicrotime:protected] => 1268104035.419 [_boundParams:protected] => 数组 ( ) ) ) [_启用:受保护] => 1 [_filterElapsedSecs:protected] => [_filterTypes:protected] => )

我做错了什么 - 还是连接日志尚未添加到 Zend 框架?

【问题讨论】:

    标签: zend-framework zend-db


    【解决方案1】:

    分析器将连接和其他操作与常规查询“捆绑”在一起。

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

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

    您不会在其中找到详细信息,它只是作为“连接”操作以及所用时间记录下来的。

    【讨论】:

    • 这是我的问题 - 这对我不起作用!没有记录连接记录,所以没有什么要过滤的。我会尝试更新我的问题以提供更多信息。
    • Oracle 适配器似乎没有对探查器进行相关调用以进行连接。比较 Zend_Db_Adapter_Pdo_Abstract 和 Zend_Db_Adapter_Oracle 中的 _connect() 方法,在创建连接之前,前者调用: $q = $this->_profiler->queryStart('connect', Zend_Db_Profiler::CONNECT);然后: $this->_profiler->queryEnd($q); Oracle 适配器没有对分析器的引用(至少到 1.10.2 版),但我想它可能就像在 _connect() 方法中添加等效调用一样简单。
    猜你喜欢
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2014-02-07
    • 2017-09-09
    相关资源
    最近更新 更多