summaryrefslogtreecommitdiff
path: root/system/libraries/Profiler.php
diff options
context:
space:
mode:
Diffstat (limited to 'system/libraries/Profiler.php')
-rw-r--r--system/libraries/Profiler.php306
1 files changed, 306 insertions, 0 deletions
diff --git a/system/libraries/Profiler.php b/system/libraries/Profiler.php
new file mode 100644
index 0000000..3ac8707
--- /dev/null
+++ b/system/libraries/Profiler.php
@@ -0,0 +1,306 @@
+<?php defined('SYSPATH') OR die('No direct access allowed.');
+/**
+ * Adds useful information to the bottom of the current page for debugging and optimization purposes.
+ *
+ * Benchmarks - The times and memory usage of benchmarks run by the Benchmark library.
+ * Database - The raw SQL and number of affected rows of Database queries.
+ * Session Data - Data stored in the current session if using the Session library.
+ * POST Data - The name and values of any POST data submitted to the current page.
+ * Cookie Data - All cookies sent for the current request.
+ *
+ * @package Kohana
+ * @author Kohana Team
+ * @copyright (c) 2007-2009 Kohana Team
+ * @license http://kohanaphp.com/license
+ */
+class Profiler_Core {
+
+ protected static $profiles = array();
+ protected static $show;
+
+ /**
+ * Enable the profiler.
+ *
+ * @return void
+ */
+ public static function enable()
+ {
+ // Add all built in profiles to event
+ Event::add('profiler.run', array('Profiler', 'benchmarks'));
+ Event::add('profiler.run', array('Profiler', 'database'));
+ Event::add('profiler.run', array('Profiler', 'session'));
+ Event::add('profiler.run', array('Profiler', 'post'));
+ Event::add('profiler.run', array('Profiler', 'cookies'));
+
+ // Add profiler to page output automatically
+ Event::add('system.display', array('Profiler', 'render'));
+
+ Kohana_Log::add('debug', 'Profiler library enabled');
+
+ }
+
+ /**
+ * Disables the profiler for this page only.
+ * Best used when profiler is autoloaded.
+ *
+ * @return void
+ */
+ public static function disable()
+ {
+ // Removes itself from the event queue
+ Event::clear('system.display', array('Profiler', 'render'));
+ }
+
+ /**
+ * Return whether a profile should be shown.
+ * Determined by the config setting or GET parameter.
+ *
+ * @param string profile name
+ * @return boolean
+ */
+ public static function show($name)
+ {
+ return (Profiler::$show === TRUE OR (is_array(Profiler::$show) AND in_array($name, Profiler::$show))) ? TRUE : FALSE;
+ }
+
+ /**
+ * Add a new profile.
+ *
+ * @param object profile object
+ * @return boolean
+ * @throws Kohana_Exception
+ */
+ public static function add($profile)
+ {
+ if (is_object($profile))
+ {
+ Profiler::$profiles[] = $profile;
+ return TRUE;
+ }
+
+ throw new Kohana_Exception('The profile must be an object');
+ }
+
+ /**
+ * Render the profiler.
+ *
+ * @param boolean return the output instead of adding it to bottom of page
+ * @return void|string
+ */
+ public static function render($return = FALSE)
+ {
+ $start = microtime(TRUE);
+
+ // Determine the profiles that should be shown
+ $get = isset($_GET['profiler']) ? explode(',', $_GET['profiler']) : array();
+ Profiler::$show = empty($get) ? Kohana::config('profiler.show') : $get;
+
+ Event::run('profiler.run');
+
+ // Don't display if there's no profiles
+ if (empty(Profiler::$profiles))
+ return Kohana::$output;
+
+ $styles = '';
+ foreach (Profiler::$profiles as $profile)
+ {
+ $styles .= $profile->styles();
+ }
+
+ // Load the profiler view
+ $data = array
+ (
+ 'profiles' => Profiler::$profiles,
+ 'styles' => $styles,
+ 'execution_time' => microtime(TRUE) - $start
+ );
+ $view = new View('profiler/profiler', $data);
+
+ // Return rendered view if $return is TRUE
+ if ($return === TRUE)
+ return $view->render();
+
+ // Add profiler data to the output
+ if (stripos(Kohana::$output, '</body>') !== FALSE)
+ {
+ // Closing body tag was found, insert the profiler data before it
+ Kohana::$output = str_ireplace('</body>', $view->render().'</body>', Kohana::$output);
+ }
+ else
+ {
+ // Append the profiler data to the output
+ Kohana::$output .= $view->render();
+ }
+ }
+
+ /**
+ * Benchmark times and memory usage from the Benchmark library.
+ *
+ * @return void
+ */
+ public static function benchmarks()
+ {
+ if ( ! Profiler::show('benchmarks'))
+ return;
+
+ $table = new Profiler_Table();
+ $table->add_column();
+ $table->add_column('kp-column kp-data');
+ $table->add_column('kp-column kp-data');
+ $table->add_column('kp-column kp-data');
+ $table->add_row(array(__('Benchmarks'), __('Count'), __('Time'), __('Memory')), 'kp-title', 'background-color: #FFE0E0');
+
+ $benchmarks = Benchmark::get(TRUE);
+
+ // Moves the first benchmark (total execution time) to the end of the array
+ $benchmarks = array_slice($benchmarks, 1) + array_slice($benchmarks, 0, 1);
+
+ text::alternate();
+ foreach ($benchmarks as $name => $benchmark)
+ {
+ // Clean unique id from system benchmark names
+ $name = ucwords(str_replace(array('_', '-'), ' ', str_replace(SYSTEM_BENCHMARK.'_', '', $name)));
+
+ $data = array(__($name), $benchmark['count'], number_format($benchmark['time'], Kohana::config('profiler.time_decimals')), number_format($benchmark['memory'] / 1024 / 1024, Kohana::config('profiler.memory_decimals')).'MB');
+ $class = text::alternate('', 'kp-altrow');
+
+ if ($name == 'Total Execution')
+ {
+ // Clear the count column
+ $data[1] = '';
+ $class = 'kp-totalrow';
+ }
+
+ $table->add_row($data, $class);
+ }
+
+ Profiler::add($table);
+ }
+
+ /**
+ * Database query benchmarks.
+ *
+ * @return void
+ */
+ public static function database()
+ {
+ if ( ! Profiler::show('database'))
+ return;
+
+ $queries = Database::$benchmarks;
+
+ // Don't show if there are no queries
+ if (empty($queries)) return;
+
+ $table = new Profiler_Table();
+ $table->add_column();
+ $table->add_column('kp-column kp-data');
+ $table->add_column('kp-column kp-data');
+ $table->add_row(array(__('Queries'), __('Time'), __('Rows')), 'kp-title', 'background-color: #E0FFE0');
+
+ text::alternate();
+ $total_time = $total_rows = 0;
+ foreach ($queries as $query)
+ {
+ $data = array($query['query'], number_format($query['time'], Kohana::config('profiler.time_decimals')), $query['rows']);
+ $class = text::alternate('', 'kp-altrow');
+ $table->add_row($data, $class);
+ $total_time += $query['time'];
+ $total_rows += $query['rows'];
+ }
+
+ $data = array(__('Total: ') . count($queries), number_format($total_time, Kohana::config('profiler.time_decimals')), $total_rows);
+ $table->add_row($data, 'kp-totalrow');
+
+ Profiler::add($table);
+ }
+
+ /**
+ * Session data.
+ *
+ * @return void
+ */
+ public static function session()
+ {
+ if (empty($_SESSION)) return;
+
+ if ( ! Profiler::show('session'))
+ return;
+
+ $table = new Profiler_Table();
+ $table->add_column('kp-name');
+ $table->add_column();
+ $table->add_row(array(__('Session'), __('Value')), 'kp-title', 'background-color: #CCE8FB');
+
+ text::alternate();
+ foreach($_SESSION as $name => $value)
+ {
+ if (is_object($value))
+ {
+ $value = get_class($value).' [object]';
+ }
+
+ $data = array($name, $value);
+ $class = text::alternate('', 'kp-altrow');
+ $table->add_row($data, $class);
+ }
+
+ Profiler::add($table);
+ }
+
+ /**
+ * POST data.
+ *
+ * @return void
+ */
+ public static function post()
+ {
+ if (empty($_POST)) return;
+
+ if ( ! Profiler::show('post'))
+ return;
+
+ $table = new Profiler_Table();
+ $table->add_column('kp-name');
+ $table->add_column();
+ $table->add_row(array(__('POST'), __('Value')), 'kp-title', 'background-color: #E0E0FF');
+
+ text::alternate();
+ foreach($_POST as $name => $value)
+ {
+ $data = array($name, $value);
+ $class = text::alternate('', 'kp-altrow');
+ $table->add_row($data, $class);
+ }
+
+ Profiler::add($table);
+ }
+
+ /**
+ * Cookie data.
+ *
+ * @return void
+ */
+ public static function cookies()
+ {
+ if (empty($_COOKIE)) return;
+
+ if ( ! Profiler::show('cookies'))
+ return;
+
+ $table = new Profiler_Table();
+ $table->add_column('kp-name');
+ $table->add_column();
+ $table->add_row(array(__('Cookies'), __('Value')), 'kp-title', 'background-color: #FFF4D7');
+
+ text::alternate();
+ foreach($_COOKIE as $name => $value)
+ {
+ $data = array($name, $value);
+ $class = text::alternate('', 'kp-altrow');
+ $table->add_row($data, $class);
+ }
+
+ Profiler::add($table);
+ }
+}