Zend_Db_Profiler войти в файл - PullRequest
       31

Zend_Db_Profiler войти в файл

3 голосов
/ 27 февраля 2012

Есть ли простой способ войти в запросы к файлу? У меня Firebug Profiling работает без проблем с:

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

Было бы неплохо записать это в файл без написания кода.

Есть ли класс, который я могу поменять с Zend_Db_Profiler_Firebug?

ОБНОВЛЕНИЕ: см. Мой ответ ниже.

1 Ответ

5 голосов
/ 27 февраля 2012

Начиная с 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.

...