Skip to content
avr 12 / David Regnier

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());
// ...
Laisser un commentaire


+ 9 = 14