CProfileLogRoute
CProfileLogRoute displays the profiling results in Web page.
The profiling is done by calling
YiiBase::beginProfile() and
YiiBase::endProfile(), which marks the begin and end of a code block.
CProfileLogRoute supports two types of report by setting the
report property:
- summary: list the execution time of every marked code block
- callstack: list the mark code blocks in a hierarchical view reflecting their calling sequence.
Property Details
public boolean $groupByToken;
whether to aggregate results according to profiling tokens. If false, the results will be aggregated by categories. Defaults to true. Note that this property only affects the summary report that is enabled when report is 'summary'.
public string getReport()
public void setReport(string $value)
the type of the profiling report to display. Defaults to 'summary'.
Method Details
protected array aggregateResult(array $result, float $delta)
|
$result |
array |
log result for this code block |
$delta |
float |
time spent for this code block |
{return} |
array |
|
Source Code: framework/logging/CProfileLogRoute.php#194 (
show)
protected function aggregateResult($result,$delta)
{
list($token,$calls,$min,$max,$total)=$result;
if($delta<$min)
$min=$delta;
elseif($delta>$max)
$max=$delta;
$calls++;
$total+=$delta;
return array($token,$calls,$min,$max,$total);
}
Aggregates the report result.
protected void displayCallstack(array $logs)
|
$logs |
array |
list of logs |
Source Code: framework/logging/CProfileLogRoute.php#94 (
show)
protected function displayCallstack($logs)
{
$stack=array();
$results=array();
$n=0;
foreach($logs as $log)
{
if($log[1]!==CLogger::LEVEL_PROFILE)
continue;
$message=$log[0];
if(!strncasecmp($message,'begin:',6))
{
$log[0]=substr($message,6);
$log[4]=$n;
$stack[]=$log;
$n++;
}
elseif(!strncasecmp($message,'end:',4))
{
$token=substr($message,4);
if(($last=array_pop($stack))!==null && $last[0]===$token)
{
$delta=$log[3]-$last[3];
$results[$last[4]]=array($token,$delta,count($stack));
}
else
throw new CException(Yii::t('yii','CProfileLogRoute found a mismatching code block "{token}". Make sure the calls to Yii::beginProfile() and Yii::endProfile() be properly nested.',
array('{token}'=>$token)));
}
}
// remaining entries should be closed here
$now=microtime(true);
while(($last=array_pop($stack))!==null)
$results[$last[4]]=array($last[0],$now-$last[3],count($stack));
ksort($results);
$this->render('profile-callstack',$results);
}
Displays the callstack of the profiling procedures for display.
protected void displaySummary(array $logs)
|
$logs |
array |
list of logs |
Source Code: framework/logging/CProfileLogRoute.php#137 (
show)
protected function displaySummary($logs)
{
$stack=array();
$results=array();
foreach($logs as $log)
{
if($log[1]!==CLogger::LEVEL_PROFILE)
continue;
$message=$log[0];
if(!strncasecmp($message,'begin:',6))
{
$log[0]=substr($message,6);
$stack[]=$log;
}
elseif(!strncasecmp($message,'end:',4))
{
$token=substr($message,4);
if(($last=array_pop($stack))!==null && $last[0]===$token)
{
$delta=$log[3]-$last[3];
if(!$this->groupByToken)
$token=$log[2];
if(isset($results[$token]))
$results[$token]=$this->aggregateResult($results[$token],$delta);
else
$results[$token]=array($token,1,$delta,$delta,$delta);
}
else
throw new CException(Yii::t('yii','CProfileLogRoute found a mismatching code block "{token}". Make sure the calls to Yii::beginProfile() and Yii::endProfile() be properly nested.',
array('{token}'=>$token)));
}
}
$now=microtime(true);
while(($last=array_pop($stack))!==null)
{
$delta=$now-$last[3];
$token=$this->groupByToken ? $last[0] : $last[2];
if(isset($results[$token]))
$results[$token]=$this->aggregateResult($results[$token],$delta);
else
$results[$token]=array($token,1,$delta,$delta,$delta);
}
$entries=array_values($results);
$func=create_function('$a,$b','return $a[4]<$b[4]?1:0;');
usort($entries,$func);
$this->render('profile-summary',$entries);
}
Displays the summary report of the profiling result.
public string getReport()
|
{return} |
string |
the type of the profiling report to display. Defaults to 'summary'. |
Initializes the route. This method is invoked after the route is created by the route manager.
public void processLogs(array $logs)
|
$logs |
array |
list of log messages |
Source Code: framework/logging/CProfileLogRoute.php#77 (
show)
public function processLogs($logs)
{
$app=Yii::app();
if(!($app instanceof CWebApplication) || $app->getRequest()->getIsAjaxRequest())
return;
if($this->getReport()==='summary')
$this->displaySummary($logs);
else
$this->displayCallstack($logs);
}
Displays the log messages.
public void setReport(string $value)
|
$value |
string |
the type of the profiling report to display. Valid values include 'summary' and 'callstack'. |
Source Code: framework/logging/CProfileLogRoute.php#64 (
show)
public function setReport($value)
{
if($value==='summary' || $value==='callstack')
$this->_report=$value;
else
throw new CException(Yii::t('yii','CProfileLogRoute.report "{report}" is invalid. Valid values include "summary" and "callstack".',
array('{report}'=>$value)));
}