/** * 显示页面Trace信息 * @access private */ private function showTrace() { // 系统默认显示信息 $files = get_included_files(); $info = array(); foreach ($files as $key => $file) { $info[] = $file . ' ( ' . number_format(filesize($file) / 1024, 2) . ' KB )'; } $trace = array(); $base = array('请求信息' => date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']) . ' ' . $_SERVER['SERVER_PROTOCOL'] . ' ' . $_SERVER['REQUEST_METHOD'] . ' : ' . __SELF__, '运行时间' => $this->showTime(), '内存开销' => MEMORY_LIMIT_ON ? number_format((memory_get_usage() - $GLOBALS['_startUseMems']) / 1024, 2) . ' kb' : '不支持', '查询信息' => Debug::record('db_query') . ' queries ' . Debug::record('db_write') . ' writes ', '文件加载' => count(get_included_files()), '缓存信息' => Debug::record('cache_read') . ' gets ' . Debug::record('cache_write') . ' writes ', '配置加载' => count(c()), '会话信息' => 'SESSION_ID=' . session_id()); // 读取项目定义的Trace文件 $traceFile = CONF_PATH . 'trace.php'; if (is_file($traceFile)) { $base = array_merge($base, include $traceFile); } $debug = Debug::trace(); $tabs = C('TRACE_PAGE_TABS'); foreach ($tabs as $name => $title) { switch (strtoupper($name)) { case 'BASE': // 基本信息 $trace[$title] = $base; break; case 'FILE': // 文件信息 $trace[$title] = $info; break; default: // 调试信息 $name = strtoupper($name); if (strpos($name, '|')) { // 多组信息 $array = explode('|', $name); $result = array(); foreach ($array as $name) { $result += isset($debug[$name]) ? $debug[$name] : array(); } $trace[$title] = $result; } else { $trace[$title] = isset($debug[$name]) ? $debug[$name] : ''; } } } if ($save = C('PAGE_TRACE_SAVE')) { // 保存页面Trace日志 if (is_array($save)) { // 选择选项卡保存 $tabs = C('TRACE_PAGE_TABS'); $array = array(); foreach ($save as $tab) { $array[] = $tabs[$tab]; } } $content = date('[ c ]') . ' ' . Response::get_client_ip() . ' ' . $_SERVER['REQUEST_URI'] . "\r\n"; foreach ($trace as $key => $val) { if (!isset($array) || in_array($key, $array)) { $content .= '[ ' . $key . " ]\r\n"; if (is_array($val)) { foreach ($val as $k => $v) { $content .= (!is_numeric($k) ? $k . ':' : '') . print_r($v, true) . "\r\n"; } } else { $content .= print_r($val, true) . "\r\n"; } $content .= "\r\n"; } } error_log(str_replace('<br/>', "\r\n", $content), Log::FILE, LOG_PATH . date('y_m_d') . '_trace.log'); } unset($files, $info, $base); // 调用Trace页面模板 ob_start(); include C('TMPL_TRACE_FILE'); return ob_get_clean(); }
/** * 验证数据 支持 in between equal length regex expire ip_allow ip_deny * @access public * @param string $value 验证数据 * @param mixed $rule 验证表达式 * @param string $type 验证方式 默认为正则验证 * @return boolean */ public function check($value, $rule, $type = 'regex') { $type = strtolower(trim($type)); switch ($type) { case 'in': // 验证是否在某个指定范围之内 逗号分隔字符串或者数组 // 验证是否在某个指定范围之内 逗号分隔字符串或者数组 case 'notin': $range = is_array($rule) ? $rule : explode(',', $rule); return $type == 'in' ? in_array($value, $range) : !in_array($value, $range); case 'between': // 验证是否在某个范围 // 验证是否在某个范围 case 'notbetween': // 验证是否不在某个范围 if (is_array($rule)) { $min = $rule[0]; $max = $rule[1]; } else { list($min, $max) = explode(',', $rule); } return $type == 'between' ? $value >= $min && $value <= $max : $value < $min || $value > $max; case 'equal': // 验证是否等于某个值 // 验证是否等于某个值 case 'notequal': // 验证是否等于某个值 return $type == 'equal' ? $value == $rule : $value != $rule; case 'length': // 验证长度 $length = mb_strlen($value, 'utf-8'); // 当前数据长度 if (strpos($rule, ',')) { // 长度区间 list($min, $max) = explode(',', $rule); return $length >= $min && $length <= $max; } else { // 指定长度 return $length == $rule; } case 'expire': list($start, $end) = explode(',', $rule); if (!is_numeric($start)) { $start = strtotime($start); } if (!is_numeric($end)) { $end = strtotime($end); } return NOW_TIME >= $start && NOW_TIME <= $end; case 'ip_allow': // IP 操作许可验证 return in_array(Response::get_client_ip(), explode(',', $rule)); case 'ip_deny': // IP 操作禁止验证 return !in_array(Response::get_client_ip(), explode(',', $rule)); case 'regex': default: // 默认使用正则验证 可以使用验证类中定义的验证名称 // 检查附加规则 return $this->regex($value, $rule); } }