toolbarCollectors as $collector)
{
if ( ! class_exists($collector))
{
// @todo Log this!
continue;
}
$this->collectors[] = new $collector();
}
}
//--------------------------------------------------------------------
/**
* Run
*
* @param type $startTime
* @param type $totalTime
* @param type $startMemory
* @param type $request
* @param type $response
* @return type
*/
public function run($startTime, $totalTime, $startMemory, $request, $response): string
{
$this->startTime = $startTime;
// Data items used within the view.
$collectors = $this->collectors;
$totalTime = $totalTime * 1000;
$totalMemory = number_format((memory_get_peak_usage() - $startMemory) / 1048576, 3);
$segmentDuration = $this->roundTo($totalTime / 7, 5);
$segmentCount = (int)ceil($totalTime / $segmentDuration);
$varData = $this->collectVarData();
ob_start();
include(__DIR__.'/Toolbar/Views/toolbar.tpl.php');
$output = ob_get_contents();
ob_end_clean();
return $output;
}
//--------------------------------------------------------------------
/**
* Called within the view to display the timeline itself.
*
* @param int $segmentCount
* @param int $segmentDuration
* @return string
*/
protected function renderTimeline(int $segmentCount, int $segmentDuration): string
{
$displayTime = $segmentCount * $segmentDuration;
$rows = $this->collectTimelineData();
$output = '';
foreach ($rows as $row)
{
$output .= "
";
$output .= "| {$row['name']} | ";
$output .= "{$row['component']} | ";
$output .= "".number_format($row['duration'] * 1000, 2)." ms | ";
$output .= "";
$offset = ((($row['start'] - $this->startTime) * 1000) /
$displayTime) * 100;
$length = (($row['duration'] * 1000) / $displayTime) * 100;
$output .= "";
$output .= " | ";
$output .= "
";
}
return $output;
}
//--------------------------------------------------------------------
/**
* Returns a sorted array of timeline data arrays from the collectors.
*
* @return array
*/
protected function collectTimelineData(): array
{
$data = [];
// Collect it
foreach ($this->collectors as $collector)
{
if (! $collector->hasTimelineData())
{
continue;
}
$data = array_merge($data, $collector->timelineData());
}
// Sort it
return $data;
}
//--------------------------------------------------------------------
/**
* Returns an array of data from all of the modules
* that should be displayed in the 'Vars' tab.
*
* @return array
*/
protected function collectVarData()// : array
{
$data = [];
foreach ($this->collectors as $collector)
{
if (! $collector->hasVarData())
{
continue;
}
$data = array_merge($data, $collector->getVarData());
}
return $data;
}
//--------------------------------------------------------------------
/**
* Rounds a number to the nearest incremental value.
*
* @param $number
* @param int $increments
*
* @return float
*/
protected function roundTo($number, $increments = 5)
{
$increments = 1 / $increments;
return (ceil($number * $increments) / $increments);
}
//--------------------------------------------------------------------
}