/lenasys/trunk

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/lenasys/trunk
20.1.1 by galaxyAbstractor
* Added an simple admin panel to the codeviewer-cmssy stuff
1
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
2
/**
3
 * CodeIgniter
4
 *
5
 * An open source application development framework for PHP 5.1.6 or newer
6
 *
7
 * @package		CodeIgniter
8
 * @author		ExpressionEngine Dev Team
9
 * @copyright	Copyright (c) 2008 - 2011, 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
 */
33
class CI_Profiler {
34
35
	protected $_available_sections = array(
36
										'benchmarks',
37
										'get',
38
										'memory_usage',
39
										'post',
40
										'uri_string',
41
										'controller_info',
42
										'queries',
43
										'http_headers',
44
										'session_data',
45
										'config'
46
										);
47
48
	protected $_query_toggle_count = 25;
49
50
	protected $CI;
51
52
	// --------------------------------------------------------------------
53
54
	public function __construct($config = array())
55
	{
56
		$this->CI =& get_instance();
57
		$this->CI->load->language('profiler');
58
59
		if (isset($config['query_toggle_count']))
60
		{
61
			$this->_query_toggle_count = (int) $config['query_toggle_count'];
62
			unset($config['query_toggle_count']);
63
		}
64
65
		// default all sections to display
66
		foreach ($this->_available_sections as $section)
67
		{
68
			if ( ! isset($config[$section]))
69
			{
70
				$this->_compile_{$section} = TRUE;
71
			}
72
		}
73
74
		$this->set_sections($config);
75
	}
76
77
	// --------------------------------------------------------------------
78
79
	/**
80
	 * Set Sections
81
	 *
82
	 * Sets the private _compile_* properties to enable/disable Profiler sections
83
	 *
84
	 * @param	mixed
85
	 * @return	void
86
	 */
87
	public function set_sections($config)
88
	{
89
		foreach ($config as $method => $enable)
90
		{
91
			if (in_array($method, $this->_available_sections))
92
			{
93
				$this->_compile_{$method} = ($enable !== FALSE) ? TRUE : FALSE;
94
			}
95
		}
96
	}
97
98
	// --------------------------------------------------------------------
99
100
	/**
101
	 * Auto Profiler
102
	 *
103
	 * This function cycles through the entire array of mark points and
104
	 * matches any two points that are named identically (ending in "_start"
105
	 * and "_end" respectively).  It then compiles the execution times for
106
	 * all points and returns it as an array
107
	 *
108
	 * @return	array
109
	 */
110
	protected function _compile_benchmarks()
111
	{
112
		$profile = array();
113
		foreach ($this->CI->benchmark->marker as $key => $val)
114
		{
115
			// We match the "end" marker so that the list ends
116
			// up in the order that it was defined
117
			if (preg_match("/(.+?)_end/i", $key, $match))
118
			{
119
				if (isset($this->CI->benchmark->marker[$match[1].'_end']) AND isset($this->CI->benchmark->marker[$match[1].'_start']))
120
				{
121
					$profile[$match[1]] = $this->CI->benchmark->elapsed_time($match[1].'_start', $key);
122
				}
123
			}
124
		}
125
126
		// Build a table containing the profile data.
127
		// Note: At some point we should turn this into a template that can
128
		// be modified.  We also might want to make this data available to be logged
129
130
		$output  = "\n\n";
131
		$output .= '<fieldset id="ci_profiler_benchmarks" style="border:1px solid #900;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
132
		$output .= "\n";
133
		$output .= '<legend style="color:#900;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_benchmarks').'&nbsp;&nbsp;</legend>';
134
		$output .= "\n";
135
		$output .= "\n\n<table style='width:100%'>\n";
136
137
		foreach ($profile as $key => $val)
138
		{
139
			$key = ucwords(str_replace(array('_', '-'), ' ', $key));
140
			$output .= "<tr><td style='padding:5px;width:50%;color:#000;font-weight:bold;background-color:#ddd;'>".$key."&nbsp;&nbsp;</td><td style='padding:5px;width:50%;color:#900;font-weight:normal;background-color:#ddd;'>".$val."</td></tr>\n";
141
		}
142
143
		$output .= "</table>\n";
144
		$output .= "</fieldset>";
145
146
		return $output;
147
	}
148
149
	// --------------------------------------------------------------------
150
151
	/**
152
	 * Compile Queries
153
	 *
154
	 * @return	string
155
	 */
156
	protected function _compile_queries()
157
	{
158
		$dbs = array();
159
160
		// Let's determine which databases are currently connected to
161
		foreach (get_object_vars($this->CI) as $CI_object)
162
		{
163
			if (is_object($CI_object) && is_subclass_of(get_class($CI_object), 'CI_DB') )
164
			{
165
				$dbs[] = $CI_object;
166
			}
167
		}
168
169
		if (count($dbs) == 0)
170
		{
171
			$output  = "\n\n";
172
			$output .= '<fieldset id="ci_profiler_queries" style="border:1px solid #0000FF;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
173
			$output .= "\n";
174
			$output .= '<legend style="color:#0000FF;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_queries').'&nbsp;&nbsp;</legend>';
175
			$output .= "\n";
176
			$output .= "\n\n<table style='border:none; width:100%;'>\n";
177
			$output .="<tr><td style='width:100%;color:#0000FF;font-weight:normal;background-color:#eee;padding:5px'>".$this->CI->lang->line('profiler_no_db')."</td></tr>\n";
178
			$output .= "</table>\n";
179
			$output .= "</fieldset>";
180
181
			return $output;
182
		}
183
184
		// Load the text helper so we can highlight the SQL
185
		$this->CI->load->helper('text');
186
187
		// Key words we want bolded
188
		$highlight = array('SELECT', 'DISTINCT', 'FROM', 'WHERE', 'AND', 'LEFT&nbsp;JOIN', 'ORDER&nbsp;BY', 'GROUP&nbsp;BY', 'LIMIT', 'INSERT', 'INTO', 'VALUES', 'UPDATE', 'OR&nbsp;', 'HAVING', 'OFFSET', 'NOT&nbsp;IN', 'IN', 'LIKE', 'NOT&nbsp;LIKE', 'COUNT', 'MAX', 'MIN', 'ON', 'AS', 'AVG', 'SUM', '(', ')');
189
190
		$output  = "\n\n";
191
192
		$count = 0;
193
194
		foreach ($dbs as $db)
195
		{
196
			$count++;
197
198
			$hide_queries = (count($db->queries) > $this->_query_toggle_count) ? ' display:none' : '';
199
200
			$show_hide_js = '(<span style="cursor: pointer;" onclick="var s=document.getElementById(\'ci_profiler_queries_db_'.$count.'\').style;s.display=s.display==\'none\'?\'\':\'none\';this.innerHTML=this.innerHTML==\''.$this->CI->lang->line('profiler_section_hide').'\'?\''.$this->CI->lang->line('profiler_section_show').'\':\''.$this->CI->lang->line('profiler_section_hide').'\';">'.$this->CI->lang->line('profiler_section_hide').'</span>)';
201
202
			if ($hide_queries != '')
203
			{
204
				$show_hide_js = '(<span style="cursor: pointer;" onclick="var s=document.getElementById(\'ci_profiler_queries_db_'.$count.'\').style;s.display=s.display==\'none\'?\'\':\'none\';this.innerHTML=this.innerHTML==\''.$this->CI->lang->line('profiler_section_show').'\'?\''.$this->CI->lang->line('profiler_section_hide').'\':\''.$this->CI->lang->line('profiler_section_show').'\';">'.$this->CI->lang->line('profiler_section_show').'</span>)';
205
			}
206
207
			$output .= '<fieldset style="border:1px solid #0000FF;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
208
			$output .= "\n";
209
			$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($db->queries).'&nbsp;&nbsp;'.$show_hide_js.'</legend>';
210
			$output .= "\n";
211
			$output .= "\n\n<table style='width:100%;{$hide_queries}' id='ci_profiler_queries_db_{$count}'>\n";
212
213
			if (count($db->queries) == 0)
214
			{
215
				$output .= "<tr><td style='width:100%;color:#0000FF;font-weight:normal;background-color:#eee;padding:5px;'>".$this->CI->lang->line('profiler_no_queries')."</td></tr>\n";
216
			}
217
			else
218
			{
219
				foreach ($db->queries as $key => $val)
220
				{
221
					$time = number_format($db->query_times[$key], 4);
222
223
					$val = highlight_code($val, ENT_QUOTES);
224
225
					foreach ($highlight as $bold)
226
					{
227
						$val = str_replace($bold, '<strong>'.$bold.'</strong>', $val);
228
					}
229
230
					$output .= "<tr><td style='padding:5px; vertical-align: top;width:1%;color:#900;font-weight:normal;background-color:#ddd;'>".$time."&nbsp;&nbsp;</td><td style='padding:5px; color:#000;font-weight:normal;background-color:#ddd;'>".$val."</td></tr>\n";
231
				}
232
			}
233
234
			$output .= "</table>\n";
235
			$output .= "</fieldset>";
236
237
		}
238
239
		return $output;
240
	}
241
242
243
	// --------------------------------------------------------------------
244
245
	/**
246
	 * Compile $_GET Data
247
	 *
248
	 * @return	string
249
	 */
250
	protected function _compile_get()
251
	{
252
		$output  = "\n\n";
253
		$output .= '<fieldset id="ci_profiler_get" style="border:1px solid #cd6e00;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
254
		$output .= "\n";
255
		$output .= '<legend style="color:#cd6e00;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_get_data').'&nbsp;&nbsp;</legend>';
256
		$output .= "\n";
257
258
		if (count($_GET) == 0)
259
		{
260
			$output .= "<div style='color:#cd6e00;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_get')."</div>";
261
		}
262
		else
263
		{
264
			$output .= "\n\n<table style='width:100%; border:none'>\n";
265
266
			foreach ($_GET as $key => $val)
267
			{
268
				if ( ! is_numeric($key))
269
				{
270
					$key = "'".$key."'";
271
				}
272
273
				$output .= "<tr><td style='width:50%;color:#000;background-color:#ddd;padding:5px'>&#36;_GET[".$key."]&nbsp;&nbsp; </td><td style='width:50%;padding:5px;color:#cd6e00;font-weight:normal;background-color:#ddd;'>";
274
				if (is_array($val))
275
				{
276
					$output .= "<pre>" . htmlspecialchars(stripslashes(print_r($val, true))) . "</pre>";
277
				}
278
				else
279
				{
280
					$output .= htmlspecialchars(stripslashes($val));
281
				}
282
				$output .= "</td></tr>\n";
283
			}
284
285
			$output .= "</table>\n";
286
		}
287
		$output .= "</fieldset>";
288
289
		return $output;
290
	}
291
292
	// --------------------------------------------------------------------
293
294
	/**
295
	 * Compile $_POST Data
296
	 *
297
	 * @return	string
298
	 */
299
	protected function _compile_post()
300
	{
301
		$output  = "\n\n";
302
		$output .= '<fieldset id="ci_profiler_post" style="border:1px solid #009900;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
303
		$output .= "\n";
304
		$output .= '<legend style="color:#009900;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_post_data').'&nbsp;&nbsp;</legend>';
305
		$output .= "\n";
306
307
		if (count($_POST) == 0)
308
		{
309
			$output .= "<div style='color:#009900;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_post')."</div>";
310
		}
311
		else
312
		{
313
			$output .= "\n\n<table style='width:100%'>\n";
314
315
			foreach ($_POST as $key => $val)
316
			{
317
				if ( ! is_numeric($key))
318
				{
319
					$key = "'".$key."'";
320
				}
321
322
				$output .= "<tr><td style='width:50%;padding:5px;color:#000;background-color:#ddd;'>&#36;_POST[".$key."]&nbsp;&nbsp; </td><td style='width:50%;padding:5px;color:#009900;font-weight:normal;background-color:#ddd;'>";
323
				if (is_array($val))
324
				{
325
					$output .= "<pre>" . htmlspecialchars(stripslashes(print_r($val, TRUE))) . "</pre>";
326
				}
327
				else
328
				{
329
					$output .= htmlspecialchars(stripslashes($val));
330
				}
331
				$output .= "</td></tr>\n";
332
			}
333
334
			$output .= "</table>\n";
335
		}
336
		$output .= "</fieldset>";
337
338
		return $output;
339
	}
340
341
	// --------------------------------------------------------------------
342
343
	/**
344
	 * Show query string
345
	 *
346
	 * @return	string
347
	 */
348
	protected function _compile_uri_string()
349
	{
350
		$output  = "\n\n";
351
		$output .= '<fieldset id="ci_profiler_uri_string" style="border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
352
		$output .= "\n";
353
		$output .= '<legend style="color:#000;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_uri_string').'&nbsp;&nbsp;</legend>';
354
		$output .= "\n";
355
356
		if ($this->CI->uri->uri_string == '')
357
		{
358
			$output .= "<div style='color:#000;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_uri')."</div>";
359
		}
360
		else
361
		{
362
			$output .= "<div style='color:#000;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->uri->uri_string."</div>";
363
		}
364
365
		$output .= "</fieldset>";
366
367
		return $output;
368
	}
369
370
	// --------------------------------------------------------------------
371
372
	/**
373
	 * Show the controller and function that were called
374
	 *
375
	 * @return	string
376
	 */
377
	protected function _compile_controller_info()
378
	{
379
		$output  = "\n\n";
380
		$output .= '<fieldset id="ci_profiler_controller_info" style="border:1px solid #995300;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
381
		$output .= "\n";
382
		$output .= '<legend style="color:#995300;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_controller_info').'&nbsp;&nbsp;</legend>';
383
		$output .= "\n";
384
385
		$output .= "<div style='color:#995300;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->router->fetch_class()."/".$this->CI->router->fetch_method()."</div>";
386
387
		$output .= "</fieldset>";
388
389
		return $output;
390
	}
391
392
	// --------------------------------------------------------------------
393
394
	/**
395
	 * Compile memory usage
396
	 *
397
	 * Display total used memory
398
	 *
399
	 * @return	string
400
	 */
401
	protected function _compile_memory_usage()
402
	{
403
		$output  = "\n\n";
404
		$output .= '<fieldset id="ci_profiler_memory_usage" style="border:1px solid #5a0099;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
405
		$output .= "\n";
406
		$output .= '<legend style="color:#5a0099;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_memory_usage').'&nbsp;&nbsp;</legend>';
407
		$output .= "\n";
408
409
		if (function_exists('memory_get_usage') && ($usage = memory_get_usage()) != '')
410
		{
411
			$output .= "<div style='color:#5a0099;font-weight:normal;padding:4px 0 4px 0'>".number_format($usage).' bytes</div>';
412
		}
413
		else
414
		{
415
			$output .= "<div style='color:#5a0099;font-weight:normal;padding:4px 0 4px 0'>".$this->CI->lang->line('profiler_no_memory')."</div>";
416
		}
417
418
		$output .= "</fieldset>";
419
420
		return $output;
421
	}
422
423
	// --------------------------------------------------------------------
424
425
	/**
426
	 * Compile header information
427
	 *
428
	 * Lists HTTP headers
429
	 *
430
	 * @return	string
431
	 */
432
	protected function _compile_http_headers()
433
	{
434
		$output  = "\n\n";
435
		$output .= '<fieldset id="ci_profiler_http_headers" style="border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
436
		$output .= "\n";
437
		$output .= '<legend style="color:#000;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_headers').'&nbsp;&nbsp;(<span style="cursor: pointer;" onclick="var s=document.getElementById(\'ci_profiler_httpheaders_table\').style;s.display=s.display==\'none\'?\'\':\'none\';this.innerHTML=this.innerHTML==\''.$this->CI->lang->line('profiler_section_show').'\'?\''.$this->CI->lang->line('profiler_section_hide').'\':\''.$this->CI->lang->line('profiler_section_show').'\';">'.$this->CI->lang->line('profiler_section_show').'</span>)</legend>';
438
		$output .= "\n";
439
440
		$output .= "\n\n<table style='width:100%;display:none' id='ci_profiler_httpheaders_table'>\n";
441
442
		foreach (array('HTTP_ACCEPT', 'HTTP_USER_AGENT', 'HTTP_CONNECTION', 'SERVER_PORT', 'SERVER_NAME', 'REMOTE_ADDR', 'SERVER_SOFTWARE', 'HTTP_ACCEPT_LANGUAGE', 'SCRIPT_NAME', 'REQUEST_METHOD',' HTTP_HOST', 'REMOTE_HOST', 'CONTENT_TYPE', 'SERVER_PROTOCOL', 'QUERY_STRING', 'HTTP_ACCEPT_ENCODING', 'HTTP_X_FORWARDED_FOR') as $header)
443
		{
444
			$val = (isset($_SERVER[$header])) ? $_SERVER[$header] : '';
445
			$output .= "<tr><td style='vertical-align: top;width:50%;padding:5px;color:#900;background-color:#ddd;'>".$header."&nbsp;&nbsp;</td><td style='width:50%;padding:5px;color:#000;background-color:#ddd;'>".$val."</td></tr>\n";
446
		}
447
448
		$output .= "</table>\n";
449
		$output .= "</fieldset>";
450
451
		return $output;
452
	}
453
454
	// --------------------------------------------------------------------
455
456
	/**
457
	 * Compile config information
458
	 *
459
	 * Lists developer config variables
460
	 *
461
	 * @return	string
462
	 */
463
	protected function _compile_config()
464
	{
465
		$output  = "\n\n";
466
		$output .= '<fieldset id="ci_profiler_config" style="border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
467
		$output .= "\n";
468
		$output .= '<legend style="color:#000;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_config').'&nbsp;&nbsp;(<span style="cursor: pointer;" onclick="var s=document.getElementById(\'ci_profiler_config_table\').style;s.display=s.display==\'none\'?\'\':\'none\';this.innerHTML=this.innerHTML==\''.$this->CI->lang->line('profiler_section_show').'\'?\''.$this->CI->lang->line('profiler_section_hide').'\':\''.$this->CI->lang->line('profiler_section_show').'\';">'.$this->CI->lang->line('profiler_section_show').'</span>)</legend>';
469
		$output .= "\n";
470
471
		$output .= "\n\n<table style='width:100%; display:none' id='ci_profiler_config_table'>\n";
472
473
		foreach ($this->CI->config->config as $config=>$val)
474
		{
475
			if (is_array($val))
476
			{
477
				$val = print_r($val, TRUE);
478
			}
479
480
			$output .= "<tr><td style='padding:5px; vertical-align: top;color:#900;background-color:#ddd;'>".$config."&nbsp;&nbsp;</td><td style='padding:5px; color:#000;background-color:#ddd;'>".htmlspecialchars($val)."</td></tr>\n";
481
		}
482
483
		$output .= "</table>\n";
484
		$output .= "</fieldset>";
485
486
		return $output;
487
	}
488
489
	// --------------------------------------------------------------------
490
491
	/**
492
	 * Compile session userdata
493
	 *
494
	 * @return 	string
495
	 */
496
	private function _compile_session_data()
497
	{
498
		if ( ! isset($this->CI->session))
499
		{
500
			return;
501
		}
502
503
		$output = '<fieldset id="ci_profiler_csession" style="border:1px solid #000;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
504
		$output .= '<legend style="color:#000;">&nbsp;&nbsp;'.$this->CI->lang->line('profiler_session_data').'&nbsp;&nbsp;(<span style="cursor: pointer;" onclick="var s=document.getElementById(\'ci_profiler_session_data\').style;s.display=s.display==\'none\'?\'\':\'none\';this.innerHTML=this.innerHTML==\''.$this->CI->lang->line('profiler_section_show').'\'?\''.$this->CI->lang->line('profiler_section_hide').'\':\''.$this->CI->lang->line('profiler_section_show').'\';">'.$this->CI->lang->line('profiler_section_show').'</span>)</legend>';
505
		$output .= "<table style='width:100%;display:none' id='ci_profiler_session_data'>";
506
507
		foreach ($this->CI->session->all_userdata() as $key => $val)
508
		{
509
			if (is_array($val) OR is_object($val))
510
			{
511
				$val = print_r($val, TRUE);
512
			}
513
514
			$output .= "<tr><td style='padding:5px; vertical-align: top;color:#900;background-color:#ddd;'>".$key."&nbsp;&nbsp;</td><td style='padding:5px; color:#000;background-color:#ddd;'>".htmlspecialchars($val)."</td></tr>\n";
515
		}
516
517
		$output .= '</table>';
518
		$output .= "</fieldset>";
519
		return $output;
520
	}
521
522
	// --------------------------------------------------------------------
523
524
	/**
525
	 * Run the Profiler
526
	 *
527
	 * @return	string
528
	 */
529
	public function run()
530
	{
531
		$output = "<div id='codeigniter_profiler' style='clear:both;background-color:#fff;padding:10px;'>";
532
		$fields_displayed = 0;
533
534
		foreach ($this->_available_sections as $section)
535
		{
536
			if ($this->_compile_{$section} !== FALSE)
537
			{
538
				$func = "_compile_{$section}";
539
				$output .= $this->{$func}();
540
				$fields_displayed++;
541
			}
542
		}
543
544
		if ($fields_displayed == 0)
545
		{
546
			$output .= '<p style="border:1px solid #5a0099;padding:10px;margin:20px 0;background-color:#eee">'.$this->CI->lang->line('profiler_no_profiles').'</p>';
547
		}
548
549
		$output .= '</div>';
550
551
		return $output;
552
	}
553
}
554
555
// END CI_Profiler class
556
557
/* End of file Profiler.php */
558
/* Location: ./system/libraries/Profiler.php */