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