PageRenderTime 395ms CodeModel.GetById 241ms app.highlight 15ms RepoModel.GetById 135ms app.codeStats 0ms

/halogy/libraries/Profiler.php

https://bitbucket.org/haloweb/halogy-1.0/
PHP | 392 lines | 224 code | 65 blank | 103 comment | 22 complexity | 038d469be8664e441223abbe9a941cb4 MD5 | raw file
  1<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2/**
  3 * CodeIgniter
  4 *
  5 * An open source application development framework for PHP 4.3.2 or newer
  6 *
  7 * @package		CodeIgniter
  8 * @author		ExpressionEngine Dev Team
  9 * @copyright	Copyright (c) 2008 - 2009, EllisLab, Inc.
 10 * @license		http://codeigniter.com/user_guide/license.html
 11 * @link		http://codeigniter.com
 12 * @since		Version 1.0
 13 * @filesource
 14 */
 15
 16// ------------------------------------------------------------------------
 17
 18/**
 19 * CodeIgniter Profiler Class
 20 *
 21 * This class enables you to display benchmark, query, and other data
 22 * in order to help with debugging and optimization.
 23 *
 24 * Note: At some point it would be good to move all the HTML in this class
 25 * into a set of template files in order to allow customization.
 26 *
 27 * @package		CodeIgniter
 28 * @subpackage	Libraries
 29 * @category	Libraries
 30 * @author		ExpressionEngine Dev Team
 31 * @link		http://codeigniter.com/user_guide/general/profiling.html
 32 */
 33class CI_Profiler {
 34
 35	var $CI;
 36 	
 37 	function CI_Profiler()
 38 	{
 39 		$this->CI =& get_instance();
 40 		$this->CI->load->language('profiler');
 41 	}
 42 	
 43	// --------------------------------------------------------------------
 44
 45	/**
 46	 * Auto Profiler
 47	 *
 48	 * This function cycles through the entire array of mark points and
 49	 * matches any two points that are named identically (ending in "_start"
 50	 * and "_end" respectively).  It then compiles the execution times for
 51	 * all points and returns it as an array
 52	 *
 53	 * @access	private
 54	 * @return	array
 55	 */
 56 	function _compile_benchmarks()
 57 	{
 58  		$profile = array();
 59 		foreach ($this->CI->benchmark->marker as $key => $val)
 60 		{
 61 			// We match the "end" marker so that the list ends
 62 			// up in the order that it was defined
 63 			if (preg_match("/(.+?)_end/i", $key, $match))
 64 			{ 			
 65 				if (isset($this->CI->benchmark->marker[$match[1].'_end']) AND isset($this->CI->benchmark->marker[$match[1].'_start']))
 66 				{
 67 					$profile[$match[1]] = $this->CI->benchmark->elapsed_time($match[1].'_start', $key);
 68 				}
 69 			}
 70 		}
 71
 72		// Build a table containing the profile data.
 73		// Note: At some point we should turn this into a template that can
 74		// be modified.  We also might want to make this data available to be logged
 75	
 76		$output  = "\n\n";
 77		$output .= '<fieldset style="border:1px solid #990000;padding:6px 10px 10px 10px;margin:0 0 20px 0;background-color:#eee">';
 78		$output .= "\n";
 79		$output .= '<legend style="color:#990000;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_benchmarks').'&nbsp;&nbsp;</legend>';
 80		$output .= "\n";			
 81		$output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";
 82		
 83		foreach ($profile as $key => $val)
 84		{
 85			$key = ucwords(str_replace(array('_', '-'), ' ', $key));
 86			$output .= "<tr><td width='50%' style='color:#000;font-weight:bold;background-color:#ddd;'>".$key."&nbsp;&nbsp;</td><td width='50%' style='color:#990000;font-weight:normal;background-color:#ddd;'>".$val."</td></tr>\n";
 87		}
 88		
 89		$output .= "</table>\n";
 90		$output .= "</fieldset>";
 91 		
 92 		return $output;
 93 	}
 94 	
 95	// --------------------------------------------------------------------
 96
 97	/**
 98	 * Compile Queries
 99	 *
100	 * @access	private
101	 * @return	string
102	 */	
103	function _compile_queries()
104	{
105		$dbs = array();
106
107		// Let's determine which databases are currently connected to
108		foreach (get_object_vars($this->CI) as $CI_object)
109		{
110			if (is_object($CI_object) && is_subclass_of(get_class($CI_object), 'CI_DB') )
111			{
112				$dbs[] = $CI_object;
113			}
114		}
115					
116		if (count($dbs) == 0)
117		{
118			$output  = "\n\n";
119			$output .= '<fieldset style="border:1px solid #0000FF;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
120			$output .= "\n";
121			$output .= '<legend style="color:#0000FF;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_queries').'&nbsp;&nbsp;</legend>';
122			$output .= "\n";		
123			$output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";
124			$output .="<tr><td width='100%' style='color:#0000FF;font-weight:normal;background-color:#eee;'>".$this->CI->lang->line('profiler_no_db')."</td></tr>\n";
125			$output .= "</table>\n";
126			$output .= "</fieldset>";
127			
128			return $output;
129		}
130		
131		// Load the text helper so we can highlight the SQL
132		$this->CI->load->helper('text');
133
134		// Key words we want bolded
135		$highlight = array('SELECT', 'DISTINCT', 'FROM', 'WHERE', 'AND', 'LEFT&nbsp;JOIN', 'ORDER&nbsp;BY', 'GROUP&nbsp;BY', 'LIMIT', 'INSERT', 'INTO', 'VALUES', 'UPDATE', 'OR', 'HAVING', 'OFFSET', 'NOT&nbsp;IN', 'IN', 'LIKE', 'NOT&nbsp;LIKE', 'COUNT', 'MAX', 'MIN', 'ON', 'AS', 'AVG', 'SUM', '(', ')');
136
137		$output  = "\n\n";
138			
139		foreach ($dbs as $db)
140		{
141			$output .= '<fieldset style="border:1px solid #0000FF;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
142			$output .= "\n";
143			$output .= '<legend style="color:#0000FF;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_database').':&nbsp; '.$db->database.'&nbsp;&nbsp;&nbsp;'.$this->CI->lang->line('profiler_queries').': '.count($this->CI->db->queries).'&nbsp;&nbsp;&nbsp;</legend>';
144			$output .= "\n";		
145			$output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";
146		
147			if (count($db->queries) == 0)
148			{
149				$output .= "<tr><td width='100%' style='color:#0000FF;font-weight:normal;background-color:#eee;'>".$this->CI->lang->line('profiler_no_queries')."</td></tr>\n";
150			}
151			else
152			{				
153				foreach ($db->queries as $key => $val)
154				{					
155					$time = number_format($db->query_times[$key], 4);
156
157					$val = highlight_code($val, ENT_QUOTES);
158	
159					foreach ($highlight as $bold)
160					{
161						$val = str_replace($bold, '<strong>'.$bold.'</strong>', $val);	
162					}
163					
164					$output .= "<tr><td width='1%' valign='top' style='color:#990000;font-weight:normal;background-color:#ddd;'>".$time."&nbsp;&nbsp;</td><td style='color:#000;font-weight:normal;background-color:#ddd;'>".$val."</td></tr>\n";
165				}
166			}
167			
168			$output .= "</table>\n";
169			$output .= "</fieldset>";
170			
171		}
172		
173		return $output;
174	}
175
176	
177	// --------------------------------------------------------------------
178
179	/**
180	 * Compile $_GET Data
181	 *
182	 * @access	private
183	 * @return	string
184	 */	
185	function _compile_get()
186	{	
187		$output  = "\n\n";
188		$output .= '<fieldset style="border:1px solid #cd6e00;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
189		$output .= "\n";
190		$output .= '<legend style="color:#cd6e00;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_get_data').'&nbsp;&nbsp;</legend>';
191		$output .= "\n";
192				
193		if (count($_GET) == 0)
194		{
195			$output .= "<div style='color:#cd6e00;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_get')."</div>";
196		}
197		else
198		{
199			$output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";
200		
201			foreach ($_GET as $key => $val)
202			{
203				if ( ! is_numeric($key))
204				{
205					$key = "'".$key."'";
206				}
207			
208				$output .= "<tr><td width='50%' style='color:#000;background-color:#ddd;'>&#36;_GET[".$key."]&nbsp;&nbsp; </td><td width='50%' style='color:#cd6e00;font-weight:normal;background-color:#ddd;'>";
209				if (is_array($val))
210				{
211					$output .= "<pre>" . htmlspecialchars(stripslashes(print_r($val, true))) . "</pre>";
212				}
213				else
214				{
215					$output .= htmlspecialchars(stripslashes($val));
216				}
217				$output .= "</td></tr>\n";
218			}
219			
220			$output .= "</table>\n";
221		}
222		$output .= "</fieldset>";
223
224		return $output;	
225	}
226	
227	// --------------------------------------------------------------------
228	
229	/**
230	 * Compile $_POST Data
231	 *
232	 * @access	private
233	 * @return	string
234	 */	
235	function _compile_post()
236	{	
237		$output  = "\n\n";
238		$output .= '<fieldset style="border:1px solid #009900;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
239		$output .= "\n";
240		$output .= '<legend style="color:#009900;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_post_data').'&nbsp;&nbsp;</legend>';
241		$output .= "\n";
242				
243		if (count($_POST) == 0)
244		{
245			$output .= "<div style='color:#009900;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_post')."</div>";
246		}
247		else
248		{
249			$output .= "\n\n<table cellpadding='4' cellspacing='1' border='0' width='100%'>\n";
250		
251			foreach ($_POST as $key => $val)
252			{
253				if ( ! is_numeric($key))
254				{
255					$key = "'".$key."'";
256				}
257			
258				$output .= "<tr><td width='50%' style='color:#000;background-color:#ddd;'>&#36;_POST[".$key."]&nbsp;&nbsp; </td><td width='50%' style='color:#009900;font-weight:normal;background-color:#ddd;'>";
259				if (is_array($val))
260				{
261					$output .= "<pre>" . htmlspecialchars(stripslashes(print_r($val, true))) . "</pre>";
262				}
263				else
264				{
265					$output .= htmlspecialchars(stripslashes($val));
266				}
267				$output .= "</td></tr>\n";
268			}
269			
270			$output .= "</table>\n";
271		}
272		$output .= "</fieldset>";
273
274		return $output;	
275	}
276	
277	// --------------------------------------------------------------------
278	
279	/**
280	 * Show query string
281	 *
282	 * @access	private
283	 * @return	string
284	 */	
285	function _compile_uri_string()
286	{	
287		$output  = "\n\n";
288		$output .= '<fieldset style="border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
289		$output .= "\n";
290		$output .= '<legend style="color:#000;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_uri_string').'&nbsp;&nbsp;</legend>';
291		$output .= "\n";
292		
293		if ($this->CI->uri->uri_string == '')
294		{
295			$output .= "<div style='color:#000;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_uri')."</div>";
296		}
297		else
298		{
299			$output .= "<div style='color:#000;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->uri->uri_string."</div>";				
300		}
301		
302		$output .= "</fieldset>";
303
304		return $output;	
305	}
306
307	// --------------------------------------------------------------------
308	
309	/**
310	 * Show the controller and function that were called
311	 *
312	 * @access	private
313	 * @return	string
314	 */	
315	function _compile_controller_info()
316	{	
317		$output  = "\n\n";
318		$output .= '<fieldset style="border:1px solid #995300;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
319		$output .= "\n";
320		$output .= '<legend style="color:#995300;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_controller_info').'&nbsp;&nbsp;</legend>';
321		$output .= "\n";
322		
323		$output .= "<div style='color:#995300;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->router->fetch_class()."/".$this->CI->router->fetch_method()."</div>";				
324
325		
326		$output .= "</fieldset>";
327
328		return $output;	
329	}
330	// --------------------------------------------------------------------
331	
332	/**
333	 * Compile memory usage
334	 *
335	 * Display total used memory
336	 *
337	 * @access	public
338	 * @return	string
339	 */
340	function _compile_memory_usage()
341	{
342		$output  = "\n\n";
343		$output .= '<fieldset style="border:1px solid #5a0099;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
344		$output .= "\n";
345		$output .= '<legend style="color:#5a0099;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_memory_usage').'&nbsp;&nbsp;</legend>';
346		$output .= "\n";
347		
348		if (function_exists('memory_get_usage') && ($usage = memory_get_usage()) != '')
349		{
350			$output .= "<div style='color:#5a0099;font-weight:normal;padding:4px 0 4px 0'>".number_format($usage).' bytes</div>';
351		}
352		else
353		{
354			$output .= "<div style='color:#5a0099;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_memory_usage')."</div>";				
355		}
356		
357		$output .= "</fieldset>";
358
359		return $output;
360	}
361
362	// --------------------------------------------------------------------
363	
364	/**
365	 * Run the Profiler
366	 *
367	 * @access	private
368	 * @return	string
369	 */	
370	function run()
371	{
372		$output = "<div id='codeigniter_profiler' style='clear:both;background-color:#fff;padding:10px;'>";
373
374		$output .= $this->_compile_uri_string();
375		$output .= $this->_compile_controller_info();
376		$output .= $this->_compile_memory_usage();
377		$output .= $this->_compile_benchmarks();
378		$output .= $this->_compile_get();
379		$output .= $this->_compile_post();
380		$output .= $this->_compile_queries();
381
382		$output .= '</div>';
383
384		return $output;
385	}
386
387}
388
389// END CI_Profiler class
390
391/* End of file Profiler.php */
392/* Location: ./system/libraries/Profiler.php */