Zend Включить ведение журнала SQL-запросов

Я использую это для получения соединения с базой данных atm.

    $db = Zend_Db_Table::getDefaultAdapter();

Я устанавливаю это в своей конфигурации следующим образом:

resources.db.adapter = pdo_mysql
resources.db.isDefaultTableAdapter = true
resources.db.params.host = localhost
resources.db.params.username = root
resources.db.params.password = password
resources.db.params.dbname = db
resources.db.params.profiler.enabled = true
resources.db.params.profiler.class = Zend_Db_Profiler

Например, я хотел бы вывести все в sql.log. Возможно ли это применить к адаптеру по умолчанию? например, через настройки, чтобы я мог игнорировать это в производственной среде?

Очень признателен.

Я просмотрел: Как включить вывод SQL записать файл с помощью Zend_Db? но, похоже, это не покрывает мою проблему.

/Маркус


person Oldek    schedule 13.11.2011    source источник


Ответы (3)


Существует пример расширения Zend_Db_Profiler, чтобы вы могли записывать запросы в файл /logs/db-queries.log.

Итак, вы должны сделать следующее:

  1. Создайте класс My_Db_Profiler_Log в папке библиотеки
  2. Добавьте следующие строки в application.ini

resources.db.params.profiler.enabled = истина

resources.db.params.profiler.class = My_Db_Profiler_Log

Примечание: имейте в виду, что файл журнала очень скоро станет очень большим! Так что лучше логировать только интересующие вас запросы. И этот пример следует рассматривать только как отправную точку в реализации такой системы логирования.

Вот код пользовательского класса профилировщика:

<?php

class My_Db_Profiler_Log extends Zend_Db_Profiler {

/**
 * Zend_Log instance
 * @var Zend_Log
 */
protected $_log;

/**
 * counter of the total elapsed time
 * @var double 
 */
protected $_totalElapsedTime;


public function __construct($enabled = false) {
    parent::__construct($enabled);

    $this->_log = new Zend_Log();
    $writer = new Zend_Log_Writer_Stream(APPLICATION_PATH . '/logs/db-queries.log');
    $this->_log->addWriter($writer);
}

/**
 * Intercept the query end and log the profiling data.
 *
 * @param  integer $queryId
 * @throws Zend_Db_Profiler_Exception
 * @return void
 */
public function queryEnd($queryId) {
    $state = parent::queryEnd($queryId);

    if (!$this->getEnabled() || $state == self::IGNORED) {
        return;
    }

    // get profile of the current query
    $profile = $this->getQueryProfile($queryId);



        // update totalElapsedTime counter
        $this->_totalElapsedTime += $profile->getElapsedSecs();

        // create the message to be logged
        $message = "\r\nElapsed Secs: " . round($profile->getElapsedSecs(), 5) . "\r\n";
        $message .= "Query: " . $profile->getQuery() . "\r\n";

        // log the message as INFO message
        $this->_log->info($message);

}

}

?>
person eroteev    schedule 14.11.2011

Расширьте Zend_Db_Profiler для записи в SQL.log и подключите профилировщик к вашему адаптеру базы данных.

<?php

class File_Profiler extends Zend_Db_Profiler {
 /**
  * The filename to save the queries
  *
  * @var string
  */
 protected $_filename;

 /**
  * The file handle
  *
  * @var resource
  */
  protected $_handle = null;

 /**
  * Class constructor
  *
  * @param string $filename
  */
 public function __construct( $filename ) {
   $this->_filename = $filename;
 }

 /**
  * Change the profiler status. If the profiler is not enabled no
  * query will be written to the destination file
  *
  * @param boolean $enabled
  */
 public function setEnabled( $enabled ) {
   parent::setEnabled($enabled);

   if( $this->getEnabled() ) {
     if( !$this->_handle ) {
       if( !($this->_handle = @fopen($this->_filename, "a")) ) {
         throw new Exception("Unable to open filename {$this->_filename} for query profiling");
       }
     }
   }
   else {
     if( $this->_handle ) {
       @fclose($this->_handle);
     }
   }
 }

 /**
  * Intercept parent::queryEnd to catch the query and write it to a file
  *
  * @param int $queryId
  */
 public function queryEnd($queryId) {
   $state = parent::queryEnd($queryId);

   if(!$this->getEnabled() || $state == self::IGNORED) {
     return;
   }

   $profile = $this->getQueryProfile($queryId);

   @fwrite($this->_handle, round($profile->getElapsedSecs(),5) . " " . $profile->getQuery() . " " . ($params=$profile->getQueryParams())?$params:null);
 }
}

Не проверял, но должно помочь. Попробуйте и дайте мне знать.

Кстати, вы знаете, что вы также можете регистрировать все запросы в mysql?

person mobius    schedule 13.11.2011
comment
Не могли бы вы немного изучить это, пожалуйста? - person Oldek; 14.11.2011

введите здесь описание изображения

это позволит вам увидеть запросы sql к веб-странице, ЭТО МОЖЕТ БЫТЬ НЕ ПО ТЕМЕ, но это полезно

Я настоятельно рекомендую вам использовать панель отладки ZF, она даст вам очень полезную информацию, которую я использую для просмотра своих доктринальных запросов, и она также поддерживала zend db

https://github.com/jokkedk/ZFDebug

person tawfekov    schedule 14.11.2011