2010-03-01 103 views
0

按照http://framework.zend.com/manual/en/zend.db.profiler.html上的示例代碼,我已經設置了我的Zend Framework應用程序的db分析。Zend_Db_Profiler沒有記錄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"; 

它工作正常的選擇/插入/更新/刪除查詢。

但我無法找到探查器來顯示啓動實際數據庫連接所用的時間,儘管文檔暗示它記錄了這一點。

我懷疑Zend_Db根本沒有用分析器記錄與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中?

回答

0

分析器「捆綁」連接和其他操作與一般查詢。

有三種方式可以檢查具體的連接:

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

然後將生成的配置文件將只包括「連接:

  1. 安裝過程中設置事件探查器的過濾器'行動。

  2. 指定的查詢類型,當你檢索查詢概況:

    foreach($profiler->getQueryProfiles() as $query) { 
    if ($query->getQueryType() == Zend_Db_Profiler::CONNECT && 
        $query->getElapsedSecs() > $longestConnectionTime) { 
         $longestConnectionTime = $query->getElapsedSecs(); 
        } 
    } 
    

$profiles = $profiler->getQueryProfiles(**Zend_Db_Profiler::CONNECT**); 
  • 檢查查詢迭代過程中直接對象

    在這裏你不會找到很好的細節,它只是作爲一個'連接'操作和所花費的時間記錄下來的。

  • +0

    雖然這是我的問題 - 這不適合我!沒有記錄連接記錄,所以不需要過濾。我會嘗試更新我的問題,以提供更多信息。 – asgeo1 2010-03-09 02:50:48

    +1

    看起來,Oracle適配器似乎沒有向Profiler進行相關的調用以進行連接。比較Zend_Db_Adapter_Pdo_Abstract和Zend_Db_Adapter_Oracle中的_connect()方法,在創建連接前,前者調用: $ q = $ this - > _ profiler-> queryStart('connect',Zend_Db_Profiler :: CONNECT); 之後: $ this - > _ profiler-> queryEnd($ q); Oracle適配器沒有引用profiler(至少到版本1.10.2),但我想它可能就像在_connect()方法中添加等效調用一樣簡單。 – 2010-03-09 16:16:25