2012-02-27 36 views
3

有沒有一種簡單的方法來登錄到文件的查詢?我有Firebug的分析工作沒有問題:Zend_Db_Profiler登錄到文件

resources.db.params.profiler.enabled = "true" 
resources.db.params.profiler.class = "Zend_Db_Profiler_Firebug" 

這將是很好,這個記錄到同出一文件寫入一串代碼。

有沒有我可以用Zend_Db_Profiler_Firebug換掉的課程?

更新:請參閱下面的答案。

回答

5

從ZF 1.11.11開始,沒有內置的profiler類將查詢記錄到文件中。目前,FireBug是唯一的專業Db分析器。

這裏有兩種方法可以在不加載額外代碼的情況下解決它。

首先,檢查出this answer,因爲它顯示瞭如何擴展Zend_Db_Profiler以使其將查詢記錄到queryEnd上的文件。如果它不完全符合您的要求,您可以擴展Zend_Db_Profiler並使用提供的代碼作爲起點。

下一個例子是一個插件,我有我的一些應用程序,我使用個人資料的查詢,當應用處於開發的一個輕微的修改。此方法利用dispatchLoopShutdown()插件獲取Db分析器的實例並將查詢記錄到文件中。

<?php /* library/My/Page/DbLogger.php */ 
class My_Page_DbLogger extends Zend_Controller_Plugin_Abstract 
{ 
    public function dispatchLoopShutdown() 
    { 
     $db  = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('db'); 
     $profiler = $db->getProfiler(); 

     if ($profiler === NULL || !($profiler instanceof Zend_Db_Profiler)) 
      return; 

     // either create your logger here based on config in application.ini 
     // or create it elsewhere and store it in the registry 
     $logger = Zend_Registry::get('dblog'); 

     $totalQueries = $profiler->getTotalNumQueries(); 
     $queryTime = $profiler->getTotalElapsedSecs(); 

     $longestTime = 0; 
     $queries  = $profiler->getQueryProfiles(); 

     if ($queries !== false) { 
      $content = "\nExecuted $totalQueries database queries in $queryTime seconds<br />\n"; 

      foreach ($queries as $query) { 
       // TODO: You could use custom logic here to log only selected queries 

       $content .= "Query (" . $query->getElapsedSecs() . "s): " . $query->getQuery() . "\n"; 
       if ($query->getElapsedSecs() > $longestTime) { 
        $longestTime = $query->getElapsedSecs(); 
       } 
      } 

      $content .= "Longest query time: $longestTime.\n" . str_repeat('-', 80); 

      $logger->info($content); 
     } 
    } 
} 

要激活這個插件,你可以在你的引導使用這樣的代碼:

/** 
* Register the profiler if we are running in a non-production mode 
*/ 
protected function _initPageProfiler() 
{ 
    if (APPLICATION_ENV == 'development') { 
     $front = Zend_Controller_Front::getInstance(); 
     $front->registerPlugin(new My_Page_DbLogger()); 
    } 
} 

理想的情況下,從長遠來看,你可能會想使擴展Zend_Db_Profiler類和允許另外選項在您的配置中指定,例如日誌文件路徑,日誌優先級。通過這種方式,您可以利用現有的過濾器到Zend_Db_Profiler

+1

謝謝你的詳細解答,你帶我下來我一直在尋找......這是令人失望的ZendFramework沒有像這樣建在路徑。我給你貸款你的答案,我會後我的答案因爲這正是我所期待的。 – 2012-02-27 21:05:08