/fuel/core/vendor/phpquickprofiler/phpquickprofiler.php
PHP | 231 lines | 155 code | 34 blank | 42 comment | 22 complexity | fce39b0d6a9536249c37675f91718504 MD5 | raw file
- <?php
- /* - - - - - - - - - - - - - - - - - - - - -
- Title : PHP Quick Profiler Class
- Author : Created by Ryan Campbell
- URL : http://particletree.com
- Last Updated : April 22, 2009
- Description : This class processes the logs and organizes the data
- for output to the browser. Initialize this class with a start time at
- the beginning of your code, and then call the display method when your code
- is terminating.
- - - - - - - - - - - - - - - - - - - - - - */
- class PhpQuickProfiler {
- public $output = array();
- public $config = '';
- public function __construct($startTime, $config = '') {
- $this->startTime = $startTime;
- $this->config = $config;
- }
- /*-------------------------------------------
- FORMAT THE DIFFERENT TYPES OF LOGS
- -------------------------------------------*/
- public function gatherConsoleData() {
- $logs = Console::getLogs();
- if($logs['console']) {
- foreach($logs['console'] as $key => $log) {
- if($log['type'] == 'log') {
- $logs['console'][$key]['data'] = print_r($log['data'], true);
- }
- elseif($log['type'] == 'memory') {
- $logs['console'][$key]['data'] = $this->getReadableFileSize($log['data']);
- }
- elseif($log['type'] == 'speed') {
- $logs['console'][$key]['data'] = $this->getReadableTime(($log['data'] - $this->startTime)*1000);
- }
- }
- }
- $this->output['logs'] = $logs;
- }
- /*-------------------------------------------
- AGGREGATE DATA ON THE PATHS ADDED
- -------------------------------------------*/
- public function gatherPathData()
- {
- $this->output['paths'] = \Finder::instance()->paths();
- $this->output['pathTotals'] = array(
- 'count' => count($this->output['paths']),
- );
- }
- /*-------------------------------------------
- AGGREGATE DATA ON THE FILES INCLUDED
- -------------------------------------------*/
- public function gatherFileData() {
- $files = get_included_files();
- $fileList = array();
- $fileTotals = array(
- "count" => count($files),
- "size" => 0,
- "largest" => 0,
- );
- foreach($files as $key => $file) {
- $size = filesize($file);
- $fileList[] = array(
- 'name' => $file,
- 'size' => $this->getReadableFileSize($size)
- );
- $fileTotals['size'] += $size;
- if($size > $fileTotals['largest']) $fileTotals['largest'] = $size;
- }
- $fileTotals['size'] = $this->getReadableFileSize($fileTotals['size']);
- $fileTotals['largest'] = $this->getReadableFileSize($fileTotals['largest']);
- $this->output['files'] = $fileList;
- $this->output['fileTotals'] = $fileTotals;
- }
- /*-------------------------------------------
- MEMORY USAGE AND MEMORY AVAILABLE
- -------------------------------------------*/
- public function gatherMemoryData() {
- $memoryTotals = array();
- $memoryTotals['used'] = $this->getReadableFileSize(memory_get_peak_usage());
- $memoryTotals['total'] = ini_get("memory_limit");
- $this->output['memoryTotals'] = $memoryTotals;
- }
- /*--------------------------------------------------------
- QUERY DATA -- DATABASE OBJECT WITH LOGGING REQUIRED
- ----------------------------------------------------------*/
- public function gatherQueryData() {
- $queryTotals = array();
- $queryTotals['count'] = 0;
- $queryTotals['time'] = 0;
- $queryTotals['duplicates'] = 0;
- $queries = array();
- $unique_queries = array();
- if($this->db != '') {
- $queryTotals['count'] += $this->db->queryCount;
- foreach($this->db->queries as $key => $query) {
- $query = $this->attemptToExplainQuery($query);
- $queryTotals['time'] += $query['time'];
- $query['time'] = $this->getReadableTime($query['time']);
- $duplicate = false;
- if ( in_array($query['sql'], $unique_queries) ) {
- $duplicate = true;
- $queryTotals['duplicates']++;
- }
- else {
- $unique_queries[] = $query['sql'];
- }
- $query['duplicate'] = $duplicate;
- $queries[] = $query;
- }
- }
- $queryTotals['time'] = $this->getReadableTime($queryTotals['time']);
- $this->output['queries'] = $queries;
- $this->output['queryTotals'] = $queryTotals;
- }
- /*--------------------------------------------------------
- CALL SQL EXPLAIN ON THE QUERY TO FIND MORE INFO
- ----------------------------------------------------------*/
- function attemptToExplainQuery($query) {
- if (substr($query['sql'],0,6) == 'SELECT')
- {
- $rs = false;
- try {
- $sql = 'EXPLAIN '.html_entity_decode($query['sql'], ENT_QUOTES);
- $rs = \DB::query($sql, \DB::SELECT)->execute();
- }
- catch(Exception $e)
- {}
- if($rs) {
- $query['explain'] = $rs[0];
- }
- }
- return $query;
- }
- /*-------------------------------------------
- SPEED DATA FOR ENTIRE PAGE LOAD
- -------------------------------------------*/
- public function gatherSpeedData() {
- $speedTotals = array();
- $speedTotals['total'] = $this->getReadableTime((static::getMicroTime() - $this->startTime)*1000);
- $speedTotals['allowed'] = ini_get("max_execution_time");
- $this->output['speedTotals'] = $speedTotals;
- }
- /*-------------------------------------------
- HELPER FUNCTIONS TO FORMAT DATA
- -------------------------------------------*/
- public static function getMicroTime() {
- $time = microtime();
- $time = explode(' ', $time);
- return $time[1] + $time[0];
- }
- public function getReadableFileSize($size, $retstring = null) {
- // adapted from code at http://aidanlister.com/repos/v/function.size_readable.php
- $sizes = array('bytes', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
- if ($retstring === null) { $retstring = '%01.2f %s'; }
- $lastsizestring = end($sizes);
- foreach ($sizes as $sizestring) {
- if ($size < 1024) { break; }
- if ($sizestring != $lastsizestring) { $size /= 1024; }
- }
- if ($sizestring == $sizes[0]) { $retstring = '%01d %s'; } // Bytes aren't normally fractional
- return sprintf($retstring, $size, $sizestring);
- }
- public function getReadableTime($time) {
- $ret = $time;
- $formatter = 0;
- $formats = array('ms', 's', 'm');
- if($time >= 1000 && $time < 60000) {
- $formatter = 1;
- $ret = ($time / 1000);
- }
- if($time >= 60000) {
- $formatter = 2;
- $ret = ($time / 1000) / 60;
- }
- $ret = number_format($ret,3,'.','') . ' ' . $formats[$formatter];
- return $ret;
- }
- /*---------------------------------------------------------
- DISPLAY TO THE SCREEN -- CALL WHEN CODE TERMINATING
- -----------------------------------------------------------*/
- public function display($db = '') {
- $this->db = $db;
- $this->gatherConsoleData();
- $this->gatherPathData();
- $this->gatherFileData();
- $this->gatherMemoryData();
- $this->gatherQueryData();
- $this->gatherSpeedData();
- require_once('display.php');
- return displayPqp($this->output);
- }
- }
- ?>