Skip to content
This repository has been archived by the owner on Jan 8, 2021. It is now read-only.

Commit

Permalink
LoggingProfiler for writing queries profiling info to logger
Browse files Browse the repository at this point in the history
  • Loading branch information
vgarvardt committed Apr 22, 2013
1 parent 1ca3161 commit d10061d
Show file tree
Hide file tree
Showing 2 changed files with 178 additions and 1 deletion.
10 changes: 9 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,15 @@ return array(
'hostname' => $dbParams['hostname'],
));

$adapter->setProfiler(new BjyProfiler\Db\Profiler\Profiler);
if (php_sapi_name() == 'cli') {
$logger = new Zend\Log\Logger();
// write queries profiling info to stdout in CLI mode
$writer = new Zend\Log\Writer\Stream('php://output');
$logger->addWriter($writer, Zend\Log\Logger::DEBUG);
$adapter->setProfiler(new BjyProfiler\Db\Profiler\LoggingProfiler($logger));
} else {
$adapter->setProfiler(new BjyProfiler\Db\Profiler\Profiler());
}
if (isset($dbParams['options']) && is_array($dbParams['options'])) {
$options = $dbParams['options'];
} else {
Expand Down
169 changes: 169 additions & 0 deletions src/BjyProfiler/Db/Profiler/LoggingProfiler.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
<?php
/**
* User: Vladimir Garvardt
* Date: 4/22/13
* Time: 5:54 PM
*/

namespace BjyProfiler\Db\Profiler;


use Zend\Log\Logger;

class LoggingProfiler extends Profiler
{
/**
* @var Logger
*/
protected $logger;
/**
* @var int
*/
protected $priority = Logger::DEBUG;
/**
* How many query profiles could be stored in memory.
* Useful for long-running scripts with tons of queries that can take all the memory.
* -1 - store all profiles
* 0 - do not store any profiles
* N > 0 - store N profiles, discard when there are more than N
*
* @var int
*/
protected $maxProfiles = 100;
/**
* Query parameters to log on query start
*
* @var array
* @see Query
*/
protected $parametersStart = array('sql', 'parameters');
/**
* Query parameters to log on query finish
*
* @var array
* @see Query
*/
protected $parametersFinish = array('elapsed');

public function __construct(Logger $logger, $enabled = true, array $options = array())
{
parent::__construct($enabled);
$this->setLogger($logger);

if (isset($options['priority'])) $this->setPriority($options['priority']);
if (isset($options['maxProfiles'])) $this->setMaxProfiles($options['maxProfiles']);
if (isset($options['parametersStart'])) $this->setParametersStart($options['parametersStart']);
if (isset($options['parametersFinish'])) $this->setParametersFinish($options['parametersFinish']);
}

public function profilerStart($target)
{
parent::profilerStart($target);

/** @var Query $lastQuery */
$lastQuery = end($this->profiles);
$this->getLogger()->log(
$this->getPriority(),
'Query started',
array_intersect_key($lastQuery->toArray(), array_flip($this->getParametersStart()))
);
}

public function profilerFinish()
{
parent::profilerFinish();

/** @var Query $lastQuery */
$lastQuery = end($this->profiles);
$this->getLogger()->log(
$this->getPriority(),
'Query finished',
array_intersect_key($lastQuery->toArray(), array_flip($this->getParametersFinish()))
);

$maxProfiles = $this->getMaxProfiles();
if ($maxProfiles > -1) {
if (count($this->profiles) > $maxProfiles) $this->profiles = array();
}
}

/**
* @param int $level
*/
public function setPriority($level)
{
$this->priority = $level;
}

/**
* @return int
*/
public function getPriority()
{
return $this->priority;
}

/**
* @param \Zend\Log\Logger $logger
*/
public function setLogger(Logger $logger)
{
$this->logger = $logger;
}

/**
* @return \Zend\Log\Logger
*/
public function getLogger()
{
return $this->logger;
}

/**
* @param int $maxProfiles
*/
public function setMaxProfiles($maxProfiles)
{
$this->maxProfiles = $maxProfiles;
}

/**
* @return int
*/
public function getMaxProfiles()
{
return $this->maxProfiles;
}

/**
* @param array $parametersFinish
*/
public function setParametersFinish(array $parametersFinish)
{
$this->parametersFinish = $parametersFinish;
}

/**
* @return array
*/
public function getParametersFinish()
{
return $this->parametersFinish;
}

/**
* @param array $parametersStart
*/
public function setParametersStart(array $parametersStart)
{
$this->parametersStart = $parametersStart;
}

/**
* @return array
*/
public function getParametersStart()
{
return $this->parametersStart;
}
}

0 comments on commit d10061d

Please sign in to comment.