* @copyright Copyright 2007-2010, Gravity Boulevard, LLC * @license http://www.gnu.org/licenses/gpl.html GPL v3 * @link http://phpwithpickles.org */ /** * Profiler Class * * The Profiler class is statically interfaced with and allows for in depth * profiling of a site. By default profiling is off, but can be enabled in the * config.ini for a site. Out of the box the profiler will report on every * class object in the system that extends the code Object class. * * Note: I really wanted to use PHP Quick Profiler by Ryan Campbell of * Particletree but it kept barking out errors when I tried to use it. Here's * a link anyway: http://particletree.com/features/php-quick-profiler/ * * @usage Profiler::log('started stuff'); */ class Profiler { /** * Profile * * Array of logged events * * @static * @access private * @var array */ private static $profile = array(); /** * Queries * * Number of queries that have been logged * * @static * @access private * @var integer */ private static $queries = 0; /** * Constructor * * Private constructor since this class is interfaced wtih statically. * * @access private */ private function __construct() { } /** * Log * * Logs the event to be displayed later on. Due to the nature of how much * of a pain it is to determine which class method called this method I * opted to make the method a passable argument for ease of use. Perhaps * I'll revisit in the future. Handles all elapsed time calculations and * memory usage. * * @static * @param mixed $data data to log * @param string $method name of the class method being logged */ public static function log($data, $method = false, $type = false) { $time = microtime(true); $data_type = gettype($data); // Tidys the data by type switch ($data_type) { case 'array': $log = '
' . print_r($data, true) . '
'; break; case 'object': $log = '[' . get_parent_class($data) . '] ' . '' . get_class($data) . '' . ($method != '' ? '->' . $method . '()' : ''); $data_type = '' . $data_type . ''; break; case 'string': default: if ($type != false) { $data_type = $type; } $log = $data; break; } self::$profile[] = array( 'log' => $log, 'type' => $data_type, 'time' => $time, 'elapsed' => $time - PICKLES_START_TIME, 'memory' => memory_get_usage(), ); } /** * Log Query * * Serves as a wrapper to get query data to the log function * * @static * @param string $query the query being executed * @param array $input_parameters optional prepared statement data * @param array $explain EXPLAIN data for the query * @param float $duration the speed of the query */ public static function logQuery($query, $input_parameters = false, $explain = false, $duration = false) { self::$queries++; $log = ''; if ($input_parameters != 'false' && is_array($input_parameters)) { $log .= '
'; foreach ($input_parameters as $key => $value) { $log .= '
' . $key . ' => ' . $value . ''; $query = str_replace($key, '' . $key . '', $query); } } $log = '' . $query . '' . $log; if (is_array($explain)) { $log .= '
'; foreach ($explain as $table) { $log .= '
Possible Keys => ' . ($table['possible_keys'] == '' ? 'NONE' : $table['possible_keys']) . '' . '
Key => ' . ($table['key'] == '' ? 'NONE' : $table['key']) . '' . '
Type => ' . $table['type'] . '' . '
Rows => ' . $table['rows'] . '' . ($table['Extra'] != '' ? '
Extra => ' . $table['Extra'] . '' : ''); } } $log .= '

Speed: ' . number_format($duration * 100, 3) . ' ms'; self::log($log, false, 'database'); } /** * Report * * Generates the Profiler report that is displayed by the Controller. * Contains all the HTML needed to display the data properly inline on the * page. Will generally be displayed after the closing HTML tag. */ public static function report() { $start_time = PICKLES_START_TIME; $peak_usage = self::formatSize(memory_get_peak_usage()); $end_time = self::$profile[count(self::$profile) - 1]['time']; $duration = ($end_time - $start_time); $logs = count(self::$profile); $logs .= ' Log' . ($logs == 1 ? '' : 's'); $files = count(get_included_files()); $files .= ' File' . ($files == 1 ? '' : 's'); $queries = self::$queries . ' Quer'. (self::$queries == 1 ? 'y' : 'ies'); ?>
PICKLES Profiler

Console
Load Time
Memory Usage
Database
Includes
$entry) { ?>
Console Memory Time
ms