You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
1.9 KiB

<?php
/**
* @copyright NetMonsters <team@netmonsters.ru>
* @link http://netmonsters.ru
* @package Majestic
* @subpackage util
* @since 2010-03-09
* @version SVN: $Id$
* @filesource $URL$
*/
class Profiler
{
protected $start = null;
protected $end = null;
protected $queries = array();
static protected $instance = null;
private function __construct()
{
if (DEBUG == false) {
throw new GeneralException('Need to turn on DEBUG before use.');
}
}
/**
* Refuse cloning
*/
private function __clone(){}
/**
* @return Profiler
*/
static public function getInstance()
{
if (!isset(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
/**
* @param string $query
* @return QueryProfiler
*/
public function profilerQuery($query)
{
$profiler = new QueryProfiler($query);
$this->queries[] = $profiler;
return $profiler;
}
public function start()
{
$this->start = microtime(true);
}
public function end($html)
{
$this->end = microtime(true);
if (stripos($html, '</body>') == False) {
return $html;
}
return str_ireplace('</body>', $this->getOutput() . '</body>', $html);
}
protected function getOutput()
{
$html = '<div style="clear:both; font:12px monospace; margin: 5px;">'
. 'Elapsed time: ' . round(($this->end- $this->start) * 1000) . 'ms.<br/>'
. 'Queries: ' . count($this->queries) . '<br/>';
foreach ($this->queries as $query) {
$html .= '[' . round($query->getElapsed() * 1000) . 'ms] ' . $query->getQuery() . '<br/>';
}
$html .= '</div>';
return $html;
}
}