/** * @brief dispatch 路由分发方法 * * @return void */ public static function dispatch() { // 注册最后的通用路由 $route = array('widget' => 'Page', 'method' => 'showPage', 'format' => '/%s/', 'patter' => '|^/([^/]+)[/]?$|', 'params' => array('alias')); self::setRoute('Page', $route); // 获取地址信息 if (OptionLibrary::get('rewrite') == 'open') { $pathInfo = str_replace(substr(LOGX_PATH, 0, strlen(LOGX_PATH) - 1), '', Request::S('REQUEST_URI', 'string')); $pathInfo = str_replace('?' . Request::S('QUERY_STRING', 'string'), '', $pathInfo); } else { $pathInfo = self::getPathInfo(); } $pathInfo = Plugin::call('pathInfo', $pathInfo); // 遍历路由表进行匹配 foreach (self::$_routeTable as $key => $route) { if (preg_match($route['patter'], $pathInfo, $matches)) { self::$_currentRoute = $key; $params = NULL; if (!empty($route['params'])) { unset($matches[0]); $params = array_combine($route['params'], $matches); } self::$_currentParams = $params; if (isset($route['widget'])) { Widget::getWidget($route['widget'])->{$route}['method']($params); } elseif (isset($route['plugin'])) { Plugin::getPlugin($route['plugin'])->{$route}['method']($params); } return; } } //echo '**'.$_SERVER['QUERY_STRING']; //$path = explode( '/', $pathInfo ); // 永久重定向为规范的 URL 地址 //Response::redirect( $pathInfo.'/', true ); // 没有匹配的路由则显示 404 页面 Response::error(404); }
/** * @brief back 返回上一页 * * @return void */ public static function back() { // 获取来源 $referer = Request::S('HTTP_REFERER', 'string'); if ($referer == NULL) { self::redirect(LOGX_PATH); } else { self::redirect($referer); } }
/** * @brief runInfo 输出运行信息 * * @return void */ public function runInfo() { $run_time = number_format(microtime(TRUE) - LogX::$_globalVars['RUN']['TIME'], 4) * 1000; // DEBUG 模式下输出额外信息 if (defined('LOGX_DEBUG')) { Log::add(_t('Process time:') . $run_time . 'ms.', E_USER_NOTICE); if (function_exists('memory_get_usage')) { $app_mem = memory_get_usage() - LogX::$_globalVars['RUN']['MEM']; Log::add(_t('Memory usage:') . $app_mem / 1024 . 'KB.', E_USER_NOTICE); } if (function_exists('memory_get_peak_usage')) { $app_mem = memory_get_peak_usage(); Log::add(_t('Max memory usage:') . $app_mem / 1024 . 'KB.', E_USER_NOTICE); } Log::add(_t('Queries:') . Database::$querynum . '. ' . _t('Query time:') . Database::$querytime * 1000 . 'ms.', E_USER_NOTICE); $content = "以下是应用运行过程中的跟踪信息:\n\n"; $content .= '当前页面:' . Request::S('REQUEST_URI', 'string') . "\n"; $content .= '请求方法:' . Request::S('REQUEST_METHOD', 'string') . "\n"; $content .= '通信协议:' . Request::S('SERVER_PROTOCOL', 'string') . "\n"; $content .= '请求时间:' . date('Y-m-d H:i:s', Request::S('REQUEST_TIME', 'string')) . "\n"; $content .= '用户代理:' . Request::S('HTTP_USER_AGENT', 'string') . "\n"; $content .= "\n日志记录:\n\n"; foreach (Log::get() as $log) { $content .= '[' . $log['LEVEL'] . '] ' . $log['MESSAGE'] . "\n"; } $files = get_included_files(); $content .= "\n加载文件:" . str_replace("\n", "\n", substr(substr(print_r($files, true), 7), 0, -2)); if (function_exists('debug_backtrace')) { $content .= "\nBACKTRACE:\n\n" . var_export(debug_backtrace(), true); } echo $content; } else { echo 'Processed in ' . $run_time . ' ms, ' . Database::$querynum . ' queries.'; } }
/** * @brief showAttachment 防盗链显示、下载附件 * * @param $params 参数 * * @return void */ public function showAttachment($params) { $meta = new MetaLibrary(); $meta->setType(3); $meta->setMID($params['mid']); if (!($m = $meta->getMeta())) { Response::error(404); return; } $m = $m[0]; // 判断 referer 防盗链 $referer = Request::S('HTTP_REFERER', 'string'); if ($referer) { $referer = parse_url($referer); $host = parse_url(OptionLibrary::get('domain')); if (LogX::getDomain($referer['host']) != LogX::getDomain($host['host'])) { Response::error(403); exit; } } $m['alias'] = LOGX_FILE . $m['alias']; // 通过判断getimagesize取出的图片信息是否存在类型标记和色彩位深来防止伪造。 $isimage = false; if (stristr($m['description'], 'image')) { if (function_exists('getimagesize')) { $imginfo = @getimagesize($m['alias']); if (isset($imginfo[2]) && isset($imginfo['bits'])) { $isimage = true; } unset($imginfo); } else { $isimage = true; } } // 附件读取形式,inline直接读取,attachment下载到本地 $disposition = $isimage ? 'inline' : 'attachment'; // 统计附件下载次数 if ($disposition == 'attachment') { $meta->incReply($params['mid']); } $m['description'] = $m['description'] ? $m['description'] : 'application/octet-stream'; if (is_readable($m['alias'])) { @ob_end_clean(); if ($disposition == 'inline') { Response::setExpire(60 * 24 * 365); } header('content-Encoding: none'); header('content-type: ' . $m['description']); header('content-Disposition: ' . $disposition . '; filename=' . urlencode($m['name'])); header('content-Length: ' . abs(filesize($m['alias']))); $fp = @fopen($m['alias'], 'rb'); @fpassthru($fp); @fclose($fp); exit; } else { Response::error(404); } }
/** * @brief init LogX 全局初始化方法 * * @return void */ public static function init() { // 输出 Logo if (isset($_GET['591E-D5FC-8065-CD36-D3E8-E45C-DB86-9197'])) { Response::logo(); } // 非 DEBUG 模式下关闭错误输出 if (defined('LOGX_DEBUG')) { error_reporting(E_ALL); } else { error_reporting(0); } // 设置自动载入函数 function __autoLoad($className) { if (substr($className, -7) == 'Library' && is_file(LOGX_LIB . $className . '.php')) { @(require_once LOGX_LIB . $className . '.php'); } } // 设置错误与异常处理函数 set_error_handler(array(__CLASS__, 'error')); set_exception_handler(array(__CLASS__, 'exception')); // 运行环境检查 if (!version_compare(PHP_VERSION, '5.0.0', '>=')) { throw new LogXException(sprintf(_t('LogX needs PHP 5.0.x or higher to run. You are currently running PHP %s.'), PHP_VERSION)); } if (!version_compare(PHP_VERSION, '5.2.0', '>=')) { // 针对低版本 PHP 的兼容代码 @(require_once LOGX_CORE . 'Compat.php'); } // 设置语言 if (defined('LOGX_LANGUAGE')) { Language::set(LOGX_LANGUAGE); } else { Language::set('zh-cn'); } // 预编译核心文件 global $coreFiles; if (!defined('LOGX_DEBUG') && !file_exists(LOGX_CACHE . '~core.php')) { Compile::build(LOGX_CACHE, $coreFiles, 'core'); } elseif (!defined('LOGX_DEBUG')) { $file_time = filemtime(LOGX_CACHE . '~core.php'); foreach ($coreFiles as $file) { if (filemtime($file) > $file_time) { Compile::build(LOGX_CACHE, $coreFiles, 'core'); break; } } } self::$_globalVars = array('RUN' => array('TIME' => microtime(TRUE), 'MEM' => function_exists('memory_get_usage') ? memory_get_usage() : 0, 'LANG' => 'zh-cn'), 'SYSTEM' => array('OS' => PHP_OS, 'HTTP' => Request::S('SERVER_SOFTWARE', 'string'), 'PHP' => PHP_VERSION, 'MYSQL' => ''), 'SUPPORT' => array('MYSQL' => function_exists('mysql_connect'), 'GD' => function_exists('imagecreate'), 'MEMCACHE' => function_exists('memcache_connect'), 'SHMOP' => function_exists('shmop_open'), 'GZIP' => function_exists('ob_gzhandler'), 'TIMEZONE' => function_exists('date_default_timezone_set'), 'AUTOLOAD' => function_exists('spl_autoload_register')), 'INI' => array('ALLOW_CALL_TIME_PASS_REFERENCE' => ini_get('allow_call_time_pass_reference'), 'MAGIC_QUOTES_GPC' => ini_get('magic_quotes_gpc'), 'REGISTER_GLOBALS' => ini_get('register_globals'), 'ALLOW_URL_FOPEN' => ini_get('allow_url_fopen'), 'ALLOW_URL_INCLUDE' => ini_get('allow_url_include'), 'SAFE_MODE' => ini_get('safe_mode'), 'MAX_EXECUTION_TIME' => ini_get('max_execution_time'), 'MEMORY_LIMIT' => ini_get('memory_limit'), 'POST_MAX_SIZE' => ini_get('post_max_size'), 'FILE_UPLOADS' => ini_get('file_uploads'), 'UPLOAD_MAX_FILESIZE' => ini_get('upload_max_filesize'), 'MAX_FILE_UPLOADS' => ini_get('max_file_uploads'))); // 清除不需要的变量,防止变量注入 $defined_vars = get_defined_vars(); foreach ($defined_vars as $key => $value) { if (!in_array($key, array('_POST', '_GET', '_COOKIE', '_SERVER', '_FILES'))) { ${$key} = ''; unset(${$key}); } } // 对用户输入进行转义处理 if (!get_magic_quotes_gpc()) { $_GET = self::addSlashes($_GET); $_POST = self::addSlashes($_POST); $_COOKIE = self::addSlashes($_COOKIE); } // 开启输出缓存 if (defined('LOGX_GZIP') && self::$_globalVars['SUPPORT']['GZIP']) { ob_start('ob_gzhandler'); } else { ob_start(); } // 连接到数据库 Database::connect(DB_HOST, DB_USER, DB_PWD, DB_NAME, DB_PCONNECT); self::$_globalVars['SYSTEM']['MYSQL'] = Database::version(); // 设定时区 if (self::$_globalVars['SUPPORT']['TIMEZONE']) { date_default_timezone_set(OptionLibrary::get('timezone')); } // 连接到缓存 Cache::connect(CACHE_TYPE); // 初始化路由表 Router::init(); // 初始化主题控制器 Theme::init(); // 初始化 Plugin Plugin::initPlugins(); // 初始化全局组件 Widget::initWidget('Global'); Widget::initWidget('Widget'); Widget::initWidget('Page'); Widget::initWidget('User'); // 尝试自动登录 Widget::getWidget('User')->autoLogin(); // 启动路由分发 Router::dispatch(); }