startTime = $startTime; $this->config = $config; require_once($config.'classes/Console.php'); } /*------------------------------------------- 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 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; $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']); $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) { try { $sql = 'EXPLAIN '.$query['sql']; $rs = $this->db->query($sql); } catch(Exception $e) {} if($rs) { $row = mysql_fetch_array($rs, MYSQL_ASSOC); $query['explain'] = $row; } return $query; } /*------------------------------------------- SPEED DATA FOR ENTIRE PAGE LOAD -------------------------------------------*/ public function gatherSpeedData() { $speedTotals = array(); $speedTotals['total'] = $this->getReadableTime(($this->getMicroTime() - $this->startTime)*1000); $speedTotals['allowed'] = ini_get("max_execution_time"); $this->output['speedTotals'] = $speedTotals; } /*------------------------------------------- HELPER FUNCTIONS TO FORMAT DATA -------------------------------------------*/ 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 = '', $master_db = '') { $this->db = $db; $this->master_db = $master_db; $this->gatherConsoleData(); $this->gatherFileData(); $this->gatherMemoryData(); $this->gatherQueryData(); $this->gatherSpeedData(); require_once($this->config.'display.php'); displayPqp($this->output, OWA_PUBLIC_URL.'includes/pqp/'); } } ?>