<?php
|
/**
|
* PhalApi_Helper_Tracer 全球追踪器类
|
*
|
* 用于调试,追踪接口执行的情况
|
*
|
* @package PhalApi\Helper
|
* @license http://www.phalapi.net/license GPL 协议
|
* @link http://www.phalapi.net/
|
* @author 喵了个咪<wenzhenxi@vip.qq.com> 2017-04-15
|
* @author dogstar <chanzonghuang@gmail.com> 2017-04-15
|
*/
|
|
class PhalApi_Helper_Tracer {
|
|
/**
|
* @var array $timeline 时间线
|
*/
|
protected $timeline = array();
|
|
/**
|
* @var array $sqls 所执行的SQL语句
|
*/
|
protected $sqls = array();
|
|
/**
|
* 打点,纪录当前时间点
|
* @param string $tag 当前纪录点的名称,方便最后查看路径节点
|
* @return NULL
|
*/
|
public function mark($tag = NULL) {
|
if (!DI()->debug) {
|
return;
|
}
|
|
$backTrace = debug_backtrace();
|
if (empty($this->timeline)) {
|
array_shift($backTrace);
|
}
|
// TODO 关于追踪,看下如何追踪更合适
|
|
$this->timeline[] = array(
|
'tag' => $tag,
|
'time' => $this->getCurMicroTime(),
|
'file' => isset($backTrace[0]['file']) ? $backTrace[0]['file'] : '',
|
'line' => isset($backTrace[0]['line']) ? $backTrace[0]['line'] : 0,
|
);
|
}
|
|
/**
|
* 生成报告
|
* @return array
|
*/
|
public function getStack() {
|
$stack = array();
|
|
$preMicroTime = NULL;
|
foreach ($this->timeline as $index => $item) {
|
if ($preMicroTime === NULL) {
|
$preMicroTime = $item['time'];
|
}
|
$internalTime = $item['time'] - $preMicroTime;
|
$internalTime = round($internalTime/10, 1);
|
|
$stack[] = sprintf('[#%d - %sms%s]%s(%d)',
|
$index,
|
$internalTime,
|
$item['tag'] !== NULL ? ' - ' . $item['tag'] : '',
|
$item['file'],
|
$item['line']
|
);
|
}
|
|
return $stack;
|
}
|
|
/**
|
* 获取当前毫秒时间
|
* @return float
|
*/
|
protected function getCurMicroTime() {
|
return round(microtime(true) * 10000);
|
}
|
|
/**
|
* 纪录SQL语句
|
* @param string $string SQL语句
|
* @return NULL
|
*/
|
public function sql($statement) {
|
$this->sqls[] = $statement;
|
}
|
|
/**
|
* 获取SQL语句
|
* @return array
|
*/
|
public function getSqls() {
|
return $this->sqls;
|
}
|
}
|