2011-11-13 6 views
6

Estoy usando esto para recuperar la conexión de la base de datos atm.Zend Enable SQL Query logging

$db = Zend_Db_Table::getDefaultAdapter(); 

he puesto esto en mi config así:

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 

quisiera salida de todo a un sql.log por ejemplo. ¿Es esto posible aplicar en el adaptador predeterminado? por ejemplo, a través de la configuración, por lo que puedo ignorarlo en el entorno de producción?

Much appriciated.

Miré: How to enable SQL output to log file with Zend_Db? pero no parecía cubrir mi problema.

/Marcus

Respuesta

2

Extender la Zend_Db_Profiler escribir en un SQL.LOG y conecte el generador de perfiles a su adaptador db

<?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); 
} 
} 

No han probarlo, pero se debe hacer el truco. Inténtalo y cuéntame.

Por cierto, ¿sabe que también puede registrar todas las consultas en el mysql?

+0

Podría explorar eso un poco, por favor? – Oldek

+0

Genial, pero muestre la muestra de uso de esto. – Vlado

12

Hay un ejemplo de extender Zend_Db_Profiler para que pueda escribir las consultas en el archivo /logs/db-queries.log.

lo que tiene que hacer lo siguiente:

  1. Crear clase My_Db_Profiler_Log en la carpeta de biblioteca
  2. Añadir las siguientes líneas al application.ini

resources.db.params.profiler .enabled = true

resources.db.params.profiler.class = My_Db_Profiler_Log

Nota: tenga en cuenta que el archivo de registro será muy grande, ¡muy pronto! Por lo tanto, es una buena idea registrar solo las consultas que le interesan. Y este ejemplo debe considerarse solo como un punto de partida en la implementación de dicho sistema de registro.

Este es el código para la clase de perfiles personalizados:

<?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); 

} 

} 

?> 
2

enter image description here

esto le permitirá ver las consultas SQL a la página web, PUEDE SER fuera de tema pero útil

Se me recomienda encarecidamente que utilice la barra de depuración ZF, le dará información muy útil la estoy usando para ver mis consultas de doctrina, y tenía soporte para zend db demasiado

https://github.com/jokkedk/ZFDebug