包 | system.logging |
---|---|
继承 | class CProfileLogRoute » CWebLogRoute » CLogRoute » CComponent |
源自 | 1.0 |
版本 | $Id: CProfileLogRoute.php 3515 2011-12-28 12:29:24Z mdomba $ |
源码 |
CProfileLogRoute在网页中显示分析结果。
通过调用YiiBase::beginProfile() 和 YiiBase::endProfile()完成分析, 它们标记开始和结束的代码块。
CProfileLogRoute通过设置report属性支持两种类型报告:
通过调用YiiBase::beginProfile() 和 YiiBase::endProfile()完成分析, 它们标记开始和结束的代码块。
CProfileLogRoute通过设置report属性支持两种类型报告:
- summary: 每一个标记代码块的执行时间列表
- callstack: 在一个分层的视图中列出标记代码块,反映它们的调用顺序。
公共属性
属性 | 类型 | 描述 | 定义在 |
---|---|---|---|
categories | string | 被逗号或空格分隔的类别列表。默认为空,意味着所有类别。 | CLogRoute |
enabled | boolean | 是否启用这个日志路由。默认为true。 | CLogRoute |
filter | mixed | 附加过滤器 (例如 CLogFilter) 它被应用到日志信息。
这个属性的值被传递到 Yii::createComponent 创建一个日志过滤器对象。
结果,这可能是一个表示过滤器类名的字符串或一个表示过滤器配置的数组。
总之,日志过滤器类应该是 CLogFilter 或它的一个子类。 默认为null,意味着没有过滤器被使用。 |
CLogRoute |
groupByToken | boolean | 是否按照分析令牌总计结果。 如果为false,结果将被类别合并。 默认为true。注意这个属性仅仅对摘要报告有效, 当report是‘summary’时启用它。 | CProfileLogRoute |
ignoreAjaxInFireBug | boolean | 在Firebug中的Ajax调用的日志是否应该被忽略。默认为true。 这个选项要小心使用,,因为一个ajax调用返回所有的输出作为一个结果数据。 例如,如果ajax调用一个json格式的返回结果,任何来自日志记录器的输出将引起ajax调用失败。 | CWebLogRoute |
levels | string | 用逗号或空格分隔的等级列表。默认是空,意味着所有等级。 | CLogRoute |
logs | array | 到目前为止这个日志路由搜集的日志。 | CLogRoute |
report | string | 要显示的分析报告的类型。默认为‘summary’。 | CProfileLogRoute |
showInFireBug | boolean | 是否此日期应该显示在FireBug而不是浏览器窗口。默认为false。 | CWebLogRoute |
公共方法
受保护方法
方法 | 描述 | 定义在 |
---|---|---|
aggregateResult() | 聚焦报告结果。 | CProfileLogRoute |
displayCallstack() | 显示分析程序为显示的调用堆栈。 | CProfileLogRoute |
displaySummary() | 显示分析结果的报告摘要。 | CProfileLogRoute |
formatLogMessage() | 格式化一条日志信息已给定不同字段。 | CLogRoute |
render() | 渲染该视图。 | CWebLogRoute |
属性详细
groupByToken
属性
public boolean $groupByToken;
是否按照分析令牌总计结果。 如果为false,结果将被类别合并。 默认为true。注意这个属性仅仅对摘要报告有效, 当report是‘summary’时启用它。
report
属性
要显示的分析报告的类型。默认为‘summary’。
方法详细
aggregateResult()
方法
protected array aggregateResult(array $result, float $delta)
| ||
$result | array | 这个代码块的日志结果 |
$delta | float | 这个代码块花费的时间 |
{return} | array |
protected function aggregateResult($result,$delta)
{
list($token,$calls,$min,$max,$total)=$result;
if($delta<$min)
$min=$delta;
else if($delta>$max)
$max=$delta;
$calls++;
$total+=$delta;
return array($token,$calls,$min,$max,$total);
}
聚焦报告结果。
displayCallstack()
方法
protected void displayCallstack(array $logs)
| ||
$logs | array | 日志列表 |
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++;
}
else if(!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);
}
显示分析程序为显示的调用堆栈。
displaySummary()
方法
protected void displaySummary(array $logs)
| ||
$logs | array | 日志列表 |
protected function displaySummary($logs)
{
$stack=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;
}
else if(!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);
}
显示分析结果的报告摘要。
getReport()
方法
public string getReport()
| ||
{return} | string | 要显示的分析报告的类型。默认为‘summary’。 |
public function getReport()
{
return $this->_report;
}
init()
方法
public void init()
|
public function init()
{
$this->levels=CLogger::LEVEL_PROFILE;
}
初始化此路由。 这个方法在路由管理器创建此路由后发起。
processLogs()
方法
public void processLogs(array $logs)
| ||
$logs | array | 日志信息列表 |
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);
}
显示日志信息。
setReport()
方法
public void setReport(string $value)
| ||
$value | string | 要显示的分析报告的类型。有效值包括‘summary’和‘callstack’。 |
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)));
}