2017-04-15 * @author dogstar 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; } }