ThinkPHP的底层提供了一些有用的系统调试类:ThinkPHPExtendLibraryORGUtilDebug.class.php
class Debug { static private $marker = array(); /** +---------------------------------------------------------- * 标记调试位 +---------------------------------------------------------- * @access public +---------------------------------------------------------- * @param string $name 要标记的位置名称 +---------------------------------------------------------- * @return void +---------------------------------------------------------- */ static public function mark($name) { self::$marker['time'][$name] = microtime(TRUE); if(MEMORY_LIMIT_ON) { self::$marker['mem'][$name] = memory_get_usage(); self::$marker['peak'][$name] = function_exists('memory_get_peak_usage')?memory_get_peak_usage(): self::$marker['mem'][$name]; } } /** +---------------------------------------------------------- * 区间使用时间查看 +---------------------------------------------------------- * @access public +---------------------------------------------------------- * @param string $start 开始标记的名称 * @param string $end 结束标记的名称 * @param integer $decimals 时间的小数位 +---------------------------------------------------------- * @return integer +---------------------------------------------------------- */ static public function useTime($start,$end,$decimals = 6) { if ( ! isset(self::$marker['time'][$start])) return ''; if ( ! isset(self::$marker['time'][$end])) self::$marker['time'][$end] = microtime(TRUE); return number_format(self::$marker['time'][$end] - self::$marker['time'][$start], $decimals); } /** +---------------------------------------------------------- * 区间使用内存查看 +---------------------------------------------------------- * @access public +---------------------------------------------------------- * @param string $start 开始标记的名称 * @param string $end 结束标记的名称 +---------------------------------------------------------- * @return integer +---------------------------------------------------------- */ static public function useMemory($start,$end) { if(!MEMORY_LIMIT_ON) return ''; if ( ! isset(self::$marker['mem'][$start])) return ''; if ( ! isset(self::$marker['mem'][$end])) self::$marker['mem'][$end] = memory_get_usage(); return number_format((self::$marker['mem'][$end] - self::$marker['mem'][$start])/1024); } /** +---------------------------------------------------------- * 区间使用内存峰值查看 +---------------------------------------------------------- * @access public +---------------------------------------------------------- * @param string $start 开始标记的名称 * @param string $end 结束标记的名称 +---------------------------------------------------------- * @return integer +---------------------------------------------------------- */ static function getMemPeak($start,$end) { if(!MEMORY_LIMIT_ON) return ''; if ( ! isset(self::$marker['peak'][$start])) return ''; if ( ! isset(self::$marker['peak'][$end])) self::$marker['peak'][$end] = function_exists('memory_get_peak_usage')?memory_get_peak_usage(): memory_get_usage(); return number_format(max(self::$marker['peak'][$start],self::$marker['peak'][$end])/1024); } }
使用时可以在需要统计耗时的方法中这么用:
Debug::mark('getBatchTbGoods_start');//标记计时开始 $goodResults = JavaApi::getBatchTbGoods($goodIds); Debug::mark('getBatchTbGoods_end');//标记计时结束 performance_log(MODULE_NAME, ACTION_NAME, 'getBatchTbGoods', null, $this->_uid, 1, array('start' => 'getBatchTbGoods_start', 'end' => 'getBatchTbGoods_end'));//写入Log
写入Log的方法是这样的:
function performance_log($module, $action, $function, $subFunction, $userId, $order, $debugTime = array(), $section = false) { if (!$module || !$action || !$function || !$userId) { return false; } $isWrite = C(strtoupper($module) . '_' . strtoupper($action) . "_WRITE_LOG"); // 导入淘宝页写日志'TAOBAO_TBCOLLECTION_WRITE_LOG' => true,在配置文件中设置 if ($isWrite && $debugTime) { $time = Debug::useTime($debugTime['start'], $debugTime['end']); $tn = $section ? " " : ''; $logText = array("PERFORMANCE_LOG", $module, $action, $function, $subFunction, $userId, getClientIp(), $order, $time, microtime(true) . $tn); Log::write(join(',', $logText), Log::INFO); } }