Начиная с ZF 1.11.11 не существует встроенного класса профилировщика, который бы регистрировал запросы в файл.В настоящее время FireBug является единственным специализированным Db Profiler.
Вот два способа, которыми вы можете решить эту проблему, не загружая лишний код.
Во-первых, посмотрите этот ответ поскольку он показывает, как расширить Zend_Db_Profiler
, чтобы он записывал запросы в файл на queryEnd
.Если это не совсем то, что вам нужно, вы можете расширить Zend_Db_Profiler
и использовать предоставленный код в качестве отправной точки.
Этот следующий пример представляет собой небольшую модификацию плагина, который есть в некоторых моих приложениях.что я использую для профилирования запросов, когда приложение находится в разработке.Этот метод использует плагин dispatchLoopShutdown()
для получения экземпляра Db Profiler и записи запросов в файл.
<?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
.