Implémentation d’un SQL Profiler avec Zend_Db_Profiler
Nous allons voir ici, comment implémenter un SQL Profiler avec Zend Framework, le but est de pouvoir tracer toutes les requêtes SQL dans un fichier plat. Il suffit d’implémenter simplement une classe dans vos répertoires (library pour mon environnement).
Voici le contenu du fichier ~/library/Db/Profiler.php
<?php /** * Db_Profiler, * * @category Zend * @package Zend_Db_Profiler * @author David REGNIER <regnier_david@yahoo.fr> */ class Db_Profiler extends Zend_Db_Profiler { /** * Zend_Log instance * @var Zend_Log */ protected $_log; /** * Counter of the total elapsed time * @var double */ protected $_totalElapsedTime; /** * Constructor * @return void */ public function __construct($enabled = false) { parent::__construct($enabled); $this->_log = new Zend_Log(); $writer = new Zend_Log_Writer_Stream('C:\\debug_profiler.txt'); // Path to your logfile $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()) { 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); } } ?>
Voilà, maintenant, il faut simplement charger la classe dans votre « adapter », voici mon environnement pour exemple:
// ... $oZendDb = Zend_Db::factory( $oDbConfig->getDbType(), array( 'host'=> $oDbConfig->getDbHost(), 'port'=> $oDbConfig->getDbPort(), 'username'=> $oDbConfig->getDbLogin(), 'password'=> $oDbConfig->getDbPass(), 'dbname'=> $oDbConfig->getDbName(), 'profiler' => array( 'enabled' => true, 'class' => 'Db_Profiler' )) ); $oZendDb->getProfiler()->setEnabled(true); $oDbDecorator = new Db_ConnectionDecorator($oZendDb); $oDbDecorator->setKey($oDbConfig->getKey()); // ...