<?php /* vim: set expandtab tabstop=4 shiftwidth=4: */ // +----------------------------------------------------------------------+ // | PHP version 5 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997-2004 The PHP Group | // +----------------------------------------------------------------------+ // | This source file is subject to version 3.0 of the PHP license, | // | that is bundled with this package in the file LICENSE, and is | // | available through the world-wide-web at the following url: | // | http://www.php.net/license/3_0.txt. | // | If you did not receive a copy of the PHP license and are unable to | // | obtain it through the world-wide-web, please send a note to | // | [email protected] so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Authors: Original Author <[email protected]> | // | Your Name <[email protected]> | // +----------------------------------------------------------------------+ // // $Id:$ $GLOBALS['_beginTime'] = microtime(TRUE); defined('APP_NAME') or define('APP_NAME', 'App'); defined('APP_PATH') or define('APP_PATH', './App/'); defined('MEMORY_LIMIT_ON') or define('MEMORY_LIMIT_ON', true); defined('THINK_PATH') or define('THINK_PATH', 'E:\\www\\haodou\\ithink\\ThinkPHP/'); defined('APP_DEBUG') or define('APP_DEBUG', false); defined('RUNTIME_PATH') or define('RUNTIME_PATH', './App/Runtime/'); defined('RUNTIME_FILE') or define('RUNTIME_FILE', './App/Runtime/~runtime.php'); defined('THINK_VERSION') or define('THINK_VERSION', '3.1.3'); defined('MAGIC_QUOTES_GPC') or define('MAGIC_QUOTES_GPC', false); defined('IS_CGI') or define('IS_CGI', 0); defined('IS_WIN') or define('IS_WIN', 1); defined('IS_CLI') or define('IS_CLI', 0); defined('_PHP_FILE_') or define('_PHP_FILE_', '/index.php'); defined('__ROOT__') or define('__ROOT__', ''); defined('URL_COMMON') or define('URL_COMMON', 0); defined('URL_PATHINFO') or define('URL_PATHINFO', 1); defined('URL_REWRITE') or define('URL_REWRITE', 2); defined('URL_COMPAT') or define('URL_COMPAT', 3); defined('CORE_PATH') or define('CORE_PATH', 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/'); defined('EXTEND_PATH') or define('EXTEND_PATH', 'E:\\www\\haodou\\ithink\\ThinkPHP/Extend/'); defined('MODE_PATH') or define('MODE_PATH', 'E:\\www\\haodou\\ithink\\ThinkPHP/Extend/Mode/'); defined('ENGINE_PATH') or define('ENGINE_PATH', 'E:\\www\\haodou\\ithink\\ThinkPHP/Extend/Engine/'); defined('VENDOR_PATH') or define('VENDOR_PATH', 'E:\\www\\haodou\\ithink\\ThinkPHP/Extend/Vendor/'); defined('LIBRARY_PATH') or define('LIBRARY_PATH', 'E:\\www\\haodou\\ithink\\ThinkPHP/Extend/Library/'); defined('COMMON_PATH') or define('COMMON_PATH', './App/Common/'); defined('LIB_PATH') or define('LIB_PATH', './App/Lib/'); defined('CONF_PATH') or define('CONF_PATH', './App/Conf/'); defined('LANG_PATH') or define('LANG_PATH', './App/Lang/'); defined('TMPL_PATH') or define('TMPL_PATH', './App/Tpl/'); defined('HTML_PATH') or define('HTML_PATH', './App/Html/'); defined('LOG_PATH') or define('LOG_PATH', './App/Runtime/Logs/'); defined('TEMP_PATH') or define('TEMP_PATH', './App/Runtime/Temp/'); defined('DATA_PATH') or define('DATA_PATH', './App/Runtime/Data/'); defined('CACHE_PATH') or define('CACHE_PATH', './App/Runtime/Cache/'); set_include_path(get_include_path() . PATH_SEPARATOR . VENDOR_PATH); function T($template = '', $layer = '') { if (is_file($template)) { return $template; } if (false === strpos($template, '://')) { $template = APP_NAME . '://' . str_replace(':', '/', $template); } $info = parse_url($template); $file = $info['host'] . (isset($info['path']) ? $info['path'] : ''); $group = isset($info['user']) ? $info['user'] . '/' : (defined('GROUP_NAME') ? GROUP_NAME . '/' : ''); $app = $info['scheme']; $layer = $layer ? $layer : C('DEFAULT_V_LAYER'); if (($list = C('EXTEND_GROUP_LIST')) && isset($list[$app])) { $baseUrl = $list[$app] . '/' . $group . $layer . '/'; } elseif (1 == C('APP_GROUP_MODE')) { $baseUrl = dirname(BASE_LIB_PATH) . '/' . $group . $layer . '/'; } else { $baseUrl = TMPL_PATH . $group; } if ('' == $file) { $file = MODULE_NAME . C('TMPL_FILE_DEPR') . ACTION_NAME; } elseif (false === strpos($file, '/')) { $file = MODULE_NAME . C('TMPL_FILE_DEPR') . $file; } return $baseUrl . $file . C('TMPL_TEMPLATE_SUFFIX'); } function I($name, $default = '', $filter = null) { if (strpos($name, '.')) { list($method, $name) = explode('.', $name, 2); } else { $method = 'param'; } switch (strtolower($method)) { case 'get': $input = & $_GET; break; case 'post': $input = & $_POST; break; case 'put': parse_str(file_get_contents('php://input') , $input); break; case 'param': switch ($_SERVER['REQUEST_METHOD']) { case 'POST': $input = $_POST; break; case 'PUT': parse_str(file_get_contents('php://input') , $input); break; default: $input = $_GET; } if (C('VAR_URL_PARAMS') && isset($_GET[C('VAR_URL_PARAMS') ])) { $input = array_merge($input, $_GET[C('VAR_URL_PARAMS') ]); } break; case 'request': $input = & $_REQUEST; break; case 'session': $input = & $_SESSION; break; case 'cookie': $input = & $_COOKIE; break; case 'server': $input = & $_SERVER; break; case 'globals': $input = & $GLOBALS; break; default: return NULL; } if (C('VAR_FILTERS')) { $_filters = explode(',', C('VAR_FILTERS')); foreach ($_filters as $_filter) { array_walk_recursive($input, $_filter); } } if (empty($name)) { $data = $input; $filters = isset($filter) ? $filter : C('DEFAULT_FILTER'); if ($filters) { $filters = explode(',', $filters); foreach ($filters as $filter) { $data = array_map($filter, $data); } } } elseif (isset($input[$name])) { $data = $input[$name]; $filters = isset($filter) ? $filter : C('DEFAULT_FILTER'); if ($filters) { $filters = explode(',', $filters); foreach ($filters as $filter) { if (function_exists($filter)) { $data = is_array($data) ? array_map($filter, $data) : $filter($data); } else { $data = filter_var($data, is_int($filter) ? $filter : filter_id($filter)); if (false === $data) { return isset($default) ? $default : NULL; } } } } } else { $data = isset($default) ? $default : NULL; } return $data; } function G($start, $end = '', $dec = 4) { static $_info = array(); static $_mem = array(); if (is_float($end)) { $_info[$start] = $end; } elseif (!empty($end)) { if (!isset($_info[$end])) $_info[$end] = microtime(TRUE); if (MEMORY_LIMIT_ON && $dec == 'm') { if (!isset($_mem[$end])) $_mem[$end] = memory_get_usage(); return number_format(($_mem[$end] - $_mem[$start]) / 1024); } else { return number_format(($_info[$end] - $_info[$start]) , $dec); } } else { $_info[$start] = microtime(TRUE); if (MEMORY_LIMIT_ON) $_mem[$start] = memory_get_usage(); } } function N($key, $step = 0, $save = false) { static $_num = array(); if (!isset($_num[$key])) { $_num[$key] = (false !== $save) ? S('N_' . $key) : 0; } if (empty($step)) return $_num[$key]; else $_num[$key] = $_num[$key] + (int)$step; if (false !== $save) { S('N_' . $key, $_num[$key], $save); } } function parse_name($name, $type = 0) { if ($type) { return ucfirst(preg_replace("/_([a-zA-Z])/e", "strtoupper('\\1')", $name)); } else { return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name) , "_")); } } function require_cache($filename) { static $_importFiles = array(); if (!isset($_importFiles[$filename])) { if (file_exists_case($filename)) { require $filename; $_importFiles[$filename] = true; } else { $_importFiles[$filename] = false; } } return $_importFiles[$filename]; } function require_array($array, $return = false) { foreach ($array as $file) { if (require_cache($file) && $return) return true; } if ($return) return false; } function file_exists_case($filename) { if (is_file($filename)) { if (IS_WIN && C('APP_FILE_CASE')) { if (basename(realpath($filename)) != basename($filename)) return false; } return true; } return false; } function import($class, $baseUrl = '', $ext = '.class.php') { static $_file = array(); $class = str_replace(array( '.', '#' ) , array( '/', '.' ) , $class); if ('' === $baseUrl && false === strpos($class, '/')) { return alias_import($class); } if (isset($_file[$class . $baseUrl])) return true; else $_file[$class . $baseUrl] = true; $class_strut = explode('/', $class); if (empty($baseUrl)) { $libPath = defined('BASE_LIB_PATH') ? BASE_LIB_PATH : LIB_PATH; if ('@' == $class_strut[0] || APP_NAME == $class_strut[0]) { $baseUrl = dirname($libPath); $class = substr_replace($class, basename($libPath) . '/', 0, strlen($class_strut[0]) + 1); } elseif ('think' == strtolower($class_strut[0])) { $baseUrl = CORE_PATH; $class = substr($class, 6); } elseif (in_array(strtolower($class_strut[0]) , array( 'org', 'com' ))) { $baseUrl = LIBRARY_PATH; } else { $class = substr_replace($class, '', 0, strlen($class_strut[0]) + 1); $baseUrl = APP_PATH . '../' . $class_strut[0] . '/' . basename($libPath) . '/'; } } if (substr($baseUrl, -1) != '/') $baseUrl.= '/'; $classfile = $baseUrl . $class . $ext; if (!class_exists(basename($class) , false)) { return require_cache($classfile); } } function load($name, $baseUrl = '', $ext = '.php') { $name = str_replace(array( '.', '#' ) , array( '/', '.' ) , $name); if (empty($baseUrl)) { if (0 === strpos($name, '@/')) { $baseUrl = COMMON_PATH; $name = substr($name, 2); } else { $baseUrl = EXTEND_PATH . 'Function/'; } } if (substr($baseUrl, -1) != '/') $baseUrl.= '/'; require_cache($baseUrl . $name . $ext); } function vendor($class, $baseUrl = '', $ext = '.php') { if (empty($baseUrl)) $baseUrl = VENDOR_PATH; return import($class, $baseUrl, $ext); } function alias_import($alias, $classfile = '') { static $_alias = array(); if (is_string($alias)) { if (isset($_alias[$alias])) { return require_cache($_alias[$alias]); } elseif ('' !== $classfile) { $_alias[$alias] = $classfile; return; } } elseif (is_array($alias)) { $_alias = array_merge($_alias, $alias); return; } return false; } function D($name = '', $layer = '') { if (empty($name)) return new Model; static $_model = array(); $layer = $layer ? $layer : C('DEFAULT_M_LAYER'); if (strpos($name, '://')) { list($app) = explode('://', $name); $name = str_replace('://', '/' . $layer . '/', $name); } else { $app = C('DEFAULT_APP'); $name = $app . '/' . $layer . '/' . $name; } if (isset($_model[$name])) return $_model[$name]; $path = explode('/', $name); if ($list = C('EXTEND_GROUP_LIST') && isset($list[$app])) { $baseUrl = $list[$app]; import($path[2] . '/' . $path[1] . '/' . $path[3] . $layer, $baseUrl); } elseif (count($path) > 3 && 1 == C('APP_GROUP_MODE')) { $baseUrl = $path[0] == '@' ? dirname(BASE_LIB_PATH) : APP_PATH . '../' . $path[0] . '/' . C('APP_GROUP_PATH') . '/'; import($path[2] . '/' . $path[1] . '/' . $path[3] . $layer, $baseUrl); } else { import($name . $layer); } $class = basename($name . $layer); if (class_exists($class)) { $model = new $class(basename($name)); } else { $model = new Model(basename($name)); } $_model[$name] = $model; return $model; } function M($name = '', $tablePrefix = '', $connection = '') { static $_model = array(); if (strpos($name, ':')) { list($class, $name) = explode(':', $name); } else { $class = 'Model'; } $guid = $tablePrefix . $name . '_' . $class; if (!isset($_model[$guid])) $_model[$guid] = new $class($name, $tablePrefix, $connection); return $_model[$guid]; } function A($name, $layer = '', $common = false) { static $_action = array(); $layer = $layer ? $layer : C('DEFAULT_C_LAYER'); if (strpos($name, '://')) { list($app) = explode('://', $name); $name = str_replace('://', '/' . $layer . '/', $name); } else { $app = '@'; $name = '@/' . $layer . '/' . $name; } if (isset($_action[$name])) return $_action[$name]; $path = explode('/', $name); if ($list = C('EXTEND_GROUP_LIST') && isset($list[$app])) { $baseUrl = $list[$app]; import($path[2] . '/' . $path[1] . '/' . $path[3] . $layer, $baseUrl); } elseif (count($path) > 3 && 1 == C('APP_GROUP_MODE')) { $baseUrl = $path[0] == '@' ? dirname(BASE_LIB_PATH) : APP_PATH . '../' . $path[0] . '/' . C('APP_GROUP_PATH') . '/'; import($path[2] . '/' . $path[1] . '/' . $path[3] . $layer, $baseUrl); } elseif ($common) { import(str_replace('@/', '', $name) . $layer, LIB_PATH); } else { import($name . $layer); } $class = basename($name . $layer); if (class_exists($class, false)) { $action = new $class(); $_action[$name] = $action; return $action; } else { return false; } } function R($url, $vars = array() , $layer = '') { $info = pathinfo($url); $action = $info['basename']; $module = $info['dirname']; $class = A($module, $layer); if ($class) { if (is_string($vars)) { parse_str($vars, $vars); } return call_user_func_array(array(&$class, $action . C('ACTION_SUFFIX') ) , $vars); } else { return false; } } function L($name = null, $value = null) { static $_lang = array(); if (empty($name)) return $_lang; if (is_string($name)) { $name = strtoupper($name); if (is_null($value)) return isset($_lang[$name]) ? $_lang[$name] : $name; $_lang[$name] = $value; return; } if (is_array($name)) $_lang = array_merge($_lang, array_change_key_case($name, CASE_UPPER)); return; } function C($name = null, $value = null) { static $_config = array(); if (empty($name)) { if (!empty($value) && $array = S('c_' . $value)) { $_config = array_merge($_config, array_change_key_case($array)); } return $_config; } if (is_string($name)) { if (!strpos($name, '.')) { $name = strtolower($name); if (is_null($value)) return isset($_config[$name]) ? $_config[$name] : null; $_config[$name] = $value; return; } $name = explode('.', $name); $name[0] = strtolower($name[0]); if (is_null($value)) return isset($_config[$name[0]][$name[1]]) ? $_config[$name[0]][$name[1]] : null; $_config[$name[0]][$name[1]] = $value; return; } if (is_array($name)) { $_config = array_merge($_config, array_change_key_case($name)); if (!empty($value)) { S('c_' . $value, $_config); } return; } return null; } function tag($tag, &$params = NULL) { $extends = C('extends.' . $tag); $tags = C('tags.' . $tag); if (!empty($tags)) { if (empty($tags['_overlay']) && !empty($extends)) { $tags = array_unique(array_merge($extends, $tags)); } elseif (isset($tags['_overlay'])) { unset($tags['_overlay']); } } elseif (!empty($extends)) { $tags = $extends; } if ($tags) { if (APP_DEBUG) { G($tag . 'Start'); trace('[ ' . $tag . ' ] --START--', '', 'INFO'); } foreach ($tags as $key => $name) { if (!is_int($key)) { $name = $key; } B($name, $params); } if (APP_DEBUG) { trace('[ ' . $tag . ' ] --END-- [ RunTime:' . G($tag . 'Start', $tag . 'End', 6) . 's ]', '', 'INFO'); } } else { return false; } } function add_tag_behavior($tag, $behavior, $path = '') { $array = C('tags.' . $tag); if (!$array) { $array = array(); } if ($path) { $array[$behavior] = $path; } else { $array[] = $behavior; } C('tags.' . $tag, $array); } function B($name, &$params = NULL) { if (strpos($name, '/')) { list($name, $method) = explode('/', $name); } else { $method = 'run'; } $class = $name . 'Behavior'; if (APP_DEBUG) { G('behaviorStart'); } $behavior = new $class(); $behavior->$method($params); if (APP_DEBUG) { G('behaviorEnd'); trace($name . ' Behavior ::' . $method . ' [ RunTime:' . G('behaviorStart', 'behaviorEnd', 6) . 's ]', '', 'INFO'); } } function strip_whitespace($content) { $stripStr = ''; $tokens = token_get_all($content); $last_space = false; for ($i = 0, $j = count($tokens); $i < $j; $i++) { if (is_string($tokens[$i])) { $last_space = false; $stripStr.= $tokens[$i]; } else { switch ($tokens[$i][0]) { case T_COMMENT: case T_DOC_COMMENT: break; case T_WHITESPACE: if (!$last_space) { $stripStr.= ' '; $last_space = true; } break; case T_START_HEREDOC: $stripStr.= "<<<THINK\n"; break; case T_END_HEREDOC: $stripStr.= "THINK;\n"; for ($k = $i + 1; $k < $j; $k++) { if (is_string($tokens[$k]) && $tokens[$k] == ';') { $i = $k; break; } else if ($tokens[$k][0] == T_CLOSE_TAG) { break; } } break; default: $last_space = false; $stripStr.= $tokens[$i][1]; } } } return $stripStr; } function trace($value = '[think]', $label = '', $level = 'DEBUG', $record = false) { static $_trace = array(); if ('[think]' === $value) { return $_trace; } else { $info = ($label ? $label . ':' : '') . print_r($value, true); if ('ERR' == $level && C('TRACE_EXCEPTION')) { throw_exception($info); } $level = strtoupper($level); if (!isset($_trace[$level])) { $_trace[$level] = array(); } $_trace[$level][] = $info; if ((defined('IS_AJAX') && IS_AJAX) || !C('SHOW_PAGE_TRACE') || $record) { Log::record($info, $level, $record); } } } class Think { private static $_instance = array(); static public function start() { register_shutdown_function(array( 'Think', 'fatalError' )); set_error_handler(array( 'Think', 'appError' )); set_exception_handler(array( 'Think', 'appException' )); spl_autoload_register(array( 'Think', 'autoload' )); App::run(); return; } public static function autoload($class) { if (alias_import($class)) return; $libPath = defined('BASE_LIB_PATH') ? BASE_LIB_PATH : LIB_PATH; $group = defined('GROUP_NAME') && C('APP_GROUP_MODE') == 0 ? GROUP_NAME . '/' : ''; $file = $class . '.class.php'; if (substr($class, -8) == 'Behavior') { if (require_array(array( CORE_PATH . 'Behavior/' . $file, EXTEND_PATH . 'Behavior/' . $file, LIB_PATH . 'Behavior/' . $file, $libPath . 'Behavior/' . $file ) , true) || (defined('MODE_NAME') && require_cache(MODE_PATH . ucwords(MODE_NAME) . '/Behavior/' . $file))) { return; } } elseif (substr($class, -5) == 'Model') { if (require_array(array( LIB_PATH . 'Model/' . $group . $file, $libPath . 'Model/' . $file, EXTEND_PATH . 'Model/' . $file ) , true)) { return; } } elseif (substr($class, -6) == 'Action') { if (require_array(array( LIB_PATH . 'Action/' . $group . $file, $libPath . 'Action/' . $file, EXTEND_PATH . 'Action/' . $file ) , true)) { return; } } elseif (substr($class, 0, 5) == 'Cache') { if (require_array(array( EXTEND_PATH . 'Driver/Cache/' . $file, CORE_PATH . 'Driver/Cache/' . $file ) , true)) { return; } } elseif (substr($class, 0, 2) == 'Db') { if (require_array(array( EXTEND_PATH . 'Driver/Db/' . $file, CORE_PATH . 'Driver/Db/' . $file ) , true)) { return; } } elseif (substr($class, 0, 8) == 'Template') { if (require_array(array( EXTEND_PATH . 'Driver/Template/' . $file, CORE_PATH . 'Driver/Template/' . $file ) , true)) { return; } } elseif (substr($class, 0, 6) == 'TagLib') { if (require_array(array( EXTEND_PATH . 'Driver/TagLib/' . $file, CORE_PATH . 'Driver/TagLib/' . $file ) , true)) { return; } } $paths = explode(',', C('APP_AUTOLOAD_PATH')); foreach ($paths as $path) { if (import($path . '.' . $class)) return; } } static public function instance($class, $method = '') { $identify = $class . $method; if (!isset(self::$_instance[$identify])) { if (class_exists($class)) { $o = new $class(); if (!empty($method) && method_exists($o, $method)) self::$_instance[$identify] = call_user_func_array(array(&$o, $method )); else self::$_instance[$identify] = $o; } else halt(L('_CLASS_NOT_EXIST_') . ':' . $class); } return self::$_instance[$identify]; } static public function appException($e) { $error = array(); $error['message'] = $e->getMessage(); $trace = $e->getTrace(); if ('throw_exception' == $trace[0]['function']) { $error['file'] = $trace[0]['file']; $error['line'] = $trace[0]['line']; } else { $error['file'] = $e->getFile(); $error['line'] = $e->getLine(); } Log::record($error['message'], Log::ERR); halt($error); } static public function appError($errno, $errstr, $errfile, $errline) { switch ($errno) { case E_ERROR: case E_PARSE: case E_CORE_ERROR: case E_COMPILE_ERROR: case E_USER_ERROR: ob_end_clean(); if (C('OUTPUT_ENCODE')) { $zlib = ini_get('zlib.output_compression'); if (empty($zlib)) ob_start('ob_gzhandler'); } $errorStr = "$errstr " . $errfile . " 第 $errline 行."; if (C('LOG_RECORD')) Log::write("[$errno] " . $errorStr, Log::ERR); function_exists('halt') ? halt($errorStr) : exit('ERROR:' . $errorStr); break; case E_STRICT: case E_USER_WARNING: case E_USER_NOTICE: default: $errorStr = "[$errno] $errstr " . $errfile . " 第 $errline 行."; trace($errorStr, '', 'NOTIC'); break; } } static public function fatalError() { if (C('LOG_RECORD')) Log::save(); if ($e = error_get_last()) { switch ($e['type']) { case E_ERROR: case E_PARSE: case E_CORE_ERROR: case E_COMPILE_ERROR: case E_USER_ERROR: ob_end_clean(); function_exists('halt') ? halt($e) : exit('ERROR:' . $e['message'] . ' in <b>' . $e['file'] . '</b> on line <b>' . $e['line'] . '</b>'); break; } } } } class ThinkException extends Exception { } abstract class Behavior { protected $options = array(); public function __construct() { if (!empty($this->options)) { foreach ($this->options as $name => $val) { if (NULL !== C($name)) { $this->options[$name] = C($name); } else { C($name, $val); } } array_change_key_case($this->options); } } public function __get($name) { return $this->options[strtolower($name) ]; } abstract public function run(&$params); } class ReadHtmlCacheBehavior extends Behavior { protected $options = array( 'HTML_CACHE_ON' => false, 'HTML_CACHE_TIME' => 60, 'HTML_CACHE_RULES' => array() , 'HTML_FILE_SUFFIX' => '.html', ); public function run(&$params) { if (C('HTML_CACHE_ON')) { $cacheTime = $this->requireHtmlCache(); if (false !== $cacheTime && $this->checkHTMLCache(HTML_FILE_NAME, $cacheTime)) { readfile(HTML_FILE_NAME); exit(); } } } static private function requireHtmlCache() { $htmls = C('HTML_CACHE_RULES'); if (!empty($htmls)) { $htmls = array_change_key_case($htmls); $moduleName = strtolower(MODULE_NAME); $actionName = strtolower(ACTION_NAME); if (isset($htmls[$moduleName . ':' . $actionName])) { $html = $htmls[$moduleName . ':' . $actionName]; } elseif (isset($htmls[$moduleName . ':'])) { $html = $htmls[$moduleName . ':']; } elseif (isset($htmls[$actionName])) { $html = $htmls[$actionName]; } elseif (isset($htmls['*'])) { $html = $htmls['*']; } elseif (isset($htmls['empty:index']) && !class_exists(MODULE_NAME . 'Action')) { $html = $htmls['empty:index']; } elseif (isset($htmls[$moduleName . ':_empty']) && self::isEmptyAction(MODULE_NAME, ACTION_NAME)) { $html = $htmls[$moduleName . ':_empty']; } if (!empty($html)) { $rule = $html[0]; $rule = preg_replace('/{\$(_\w+)\.(\w+)\|(\w+)}/e', "\\3(\$\\1['\\2'])", $rule); $rule = preg_replace('/{\$(_\w+)\.(\w+)}/e', "\$\\1['\\2']", $rule); $rule = preg_replace('/{(\w+)\|(\w+)}/e', "\\2(\$_GET['\\1'])", $rule); $rule = preg_replace('/{(\w+)}/e', "\$_GET['\\1']", $rule); $rule = str_ireplace(array( '{:app}', '{:module}', '{:action}', '{:group}' ) , array( APP_NAME, MODULE_NAME, ACTION_NAME, defined('GROUP_NAME') ? GROUP_NAME : '' ) , $rule); $rule = preg_replace('/{|(\w+)}/e', "\\1()", $rule); if (!empty($html[2])) $rule = $html[2]($rule); $cacheTime = isset($html[1]) ? $html[1] : C('HTML_CACHE_TIME'); define('HTML_FILE_NAME', HTML_PATH . $rule . C('HTML_FILE_SUFFIX')); return $cacheTime; } } return false; } static public function checkHTMLCache($cacheFile = '', $cacheTime = '') { if (!is_file($cacheFile)) { return false; } elseif (filemtime(C('TEMPLATE_NAME')) > filemtime($cacheFile)) { return false; } elseif (!is_numeric($cacheTime) && function_exists($cacheTime)) { return $cacheTime($cacheFile); } elseif ($cacheTime != 0 && NOW_TIME > filemtime($cacheFile) + $cacheTime) { return false; } return true; } static private function isEmptyAction($module, $action) { $className = $module . 'Action'; $class = new $className; return !method_exists($class, $action); } } class CheckRouteBehavior extends Behavior { protected $options = array( 'URL_ROUTER_ON' => false, 'URL_ROUTE_RULES' => array() , ); public function run(&$return) { $regx = trim($_SERVER['PATH_INFO'], '/'); if (empty($regx)) return $return = true; if (!C('URL_ROUTER_ON')) return $return = false; $routes = C('URL_ROUTE_RULES'); if (!empty($routes)) { $depr = C('URL_PATHINFO_DEPR'); $regx = str_replace($depr, '/', $regx); foreach ($routes as $rule => $route) { if (0 === strpos($rule, '/') && preg_match($rule, $regx, $matches)) { return $return = $this->parseRegex($matches, $route, $regx); } else { $len1 = substr_count($regx, '/'); $len2 = substr_count($rule, '/'); if ($len1 >= $len2) { if ('$' == substr($rule, -1, 1)) { if ($len1 != $len2) { continue; } else { $rule = substr($rule, 0, -1); } } $match = $this->checkUrlMatch($regx, $rule); if ($match) return $return = $this->parseRule($rule, $route, $regx); } } } } $return = false; } private function checkUrlMatch($regx, $rule) { $m1 = explode('/', $regx); $m2 = explode('/', $rule); $match = true; foreach ($m2 as $key => $val) { if (':' == substr($val, 0, 1)) { if (strpos($val, '\\')) { $type = substr($val, -1); if ('d' == $type && !is_numeric($m1[$key])) { $match = false; break; } } elseif (strpos($val, '^')) { $array = explode('|', substr(strstr($val, '^') , 1)); if (in_array($m1[$key], $array)) { $match = false; break; } } } elseif (0 !== strcasecmp($val, $m1[$key])) { $match = false; break; } } return $match; } private function parseUrl($url) { $var = array(); if (false !== strpos($url, '?')) { $info = parse_url($url); $path = explode('/', $info['path']); parse_str($info['query'], $var); } elseif (strpos($url, '/')) { $path = explode('/', $url); } else { parse_str($url, $var); } if (isset($path)) { $var[C('VAR_ACTION') ] = array_pop($path); if (!empty($path)) { $var[C('VAR_MODULE') ] = array_pop($path); } if (!empty($path)) { $var[C('VAR_GROUP') ] = array_pop($path); } } return $var; } private function parseRule($rule, $route, $regx) { $url = is_array($route) ? $route[0] : $route; $paths = explode('/', $regx); $matches = array(); $rule = explode('/', $rule); foreach ($rule as $item) { if (0 === strpos($item, ':')) { if ($pos = strpos($item, '^')) { $var = substr($item, 1, $pos - 1); } elseif (strpos($item, '\\')) { $var = substr($item, 1, -2); } else { $var = substr($item, 1); } $matches[$var] = array_shift($paths); } else { array_shift($paths); } } if (0 === strpos($url, '/') || 0 === strpos($url, 'http')) { if (strpos($url, ':')) { $values = array_values($matches); $url = preg_replace('/:(\d+)/e', '$values[\\1-1]', $url); } header("Location: $url", true, (is_array($route) && isset($route[1])) ? $route[1] : 301); exit; } else { $var = $this->parseUrl($url); $values = array_values($matches); foreach ($var as $key => $val) { if (0 === strpos($val, ':')) { $var[$key] = $values[substr($val, 1) - 1]; } } $var = array_merge($matches, $var); if ($paths) { preg_replace('@(\w+)\/([^\/]+)@e', '$var[strtolower(\'\\1\')]=strip_tags(\'\\2\');', implode('/', $paths)); } if (is_array($route) && isset($route[1])) { parse_str($route[1], $params); $var = array_merge($var, $params); } $_GET = array_merge($var, $_GET); } return true; } private function parseRegex($matches, $route, $regx) { $url = is_array($route) ? $route[0] : $route; $url = preg_replace('/:(\d+)/e', '$matches[\\1]', $url); if (0 === strpos($url, '/') || 0 === strpos($url, 'http')) { header("Location: $url", true, (is_array($route) && isset($route[1])) ? $route[1] : 301); exit; } else { $var = $this->parseUrl($url); $regx = substr_replace($regx, '', 0, strlen($matches[0])); if ($regx) { preg_replace('@(\w+)\/([^,\/]+)@e', '$var[strtolower(\'\\1\')]=strip_tags(\'\\2\');', $regx); } if (is_array($route) && isset($route[1])) { parse_str($route[1], $params); $var = array_merge($var, $params); } $_GET = array_merge($var, $_GET); } return true; } } class ParseTemplateBehavior extends Behavior { protected $options = array( 'TMPL_ENGINE_TYPE' => 'Think', 'TMPL_CACHFILE_SUFFIX' => '.php', 'TMPL_DENY_FUNC_LIST' => 'echo,exit', 'TMPL_DENY_PHP' => false, 'TMPL_L_DELIM' => '{', 'TMPL_R_DELIM' => '}', 'TMPL_VAR_IDENTIFY' => 'array', 'TMPL_STRIP_SPACE' => true, 'TMPL_CACHE_ON' => true, 'TMPL_CACHE_PREFIX' => '', 'TMPL_CACHE_TIME' => 0, 'TMPL_LAYOUT_ITEM' => '{__CONTENT__}', 'LAYOUT_ON' => false, 'LAYOUT_NAME' => 'layout', 'TAGLIB_BEGIN' => '<', 'TAGLIB_END' => '>', 'TAGLIB_LOAD' => true, 'TAGLIB_BUILD_IN' => 'cx', 'TAGLIB_PRE_LOAD' => '', ); public function run(&$_data) { $engine = strtolower(C('TMPL_ENGINE_TYPE')); $_content = empty($_data['content']) ? $_data['file'] : $_data['content']; $_data['prefix'] = !empty($_data['prefix']) ? $_data['prefix'] : C('TMPL_CACHE_PREFIX'); if ('think' == $engine) { if ((!empty($_data['content']) && $this->checkContentCache($_data['content'], $_data['prefix'])) || $this->checkCache($_data['file'], $_data['prefix'])) { extract($_data['var'], EXTR_OVERWRITE); include C('CACHE_PATH') . $_data['prefix'] . md5($_content) . C('TMPL_CACHFILE_SUFFIX'); } else { $tpl = Think::instance('ThinkTemplate'); $tpl->fetch($_content, $_data['var'], $_data['prefix']); } } else { $class = 'Template' . ucwords($engine); if (class_exists($class)) { $tpl = new $class; $tpl->fetch($_content, $_data['var']); } else { throw_exception(L('_NOT_SUPPERT_') . ': ' . $class); } } } protected function checkCache($tmplTemplateFile, $prefix = '') { if (!C('TMPL_CACHE_ON')) return false; $tmplCacheFile = C('CACHE_PATH') . $prefix . md5($tmplTemplateFile) . C('TMPL_CACHFILE_SUFFIX'); if (!is_file($tmplCacheFile)) { return false; } elseif (filemtime($tmplTemplateFile) > filemtime($tmplCacheFile)) { return false; } elseif (C('TMPL_CACHE_TIME') != 0 && time() > filemtime($tmplCacheFile) + C('TMPL_CACHE_TIME')) { return false; } if (C('LAYOUT_ON')) { $layoutFile = THEME_PATH . C('LAYOUT_NAME') . C('TMPL_TEMPLATE_SUFFIX'); if (filemtime($layoutFile) > filemtime($tmplCacheFile)) { return false; } } return true; } protected function checkContentCache($tmplContent, $prefix = '') { if (is_file(C('CACHE_PATH') . $prefix . md5($tmplContent) . C('TMPL_CACHFILE_SUFFIX'))) { return true; } else { return false; } } } class ContentReplaceBehavior extends Behavior { protected $options = array( 'TMPL_PARSE_STRING' => array() , ); public function run(&$content) { $content = $this->templateContentReplace($content); } protected function templateContentReplace($content) { $replace = array( '__TMPL__' => APP_TMPL_PATH, '__ROOT__' => __ROOT__, '__APP__' => __APP__, '__GROUP__' => defined('GROUP_NAME') ? __GROUP__ : __APP__, '__ACTION__' => __ACTION__, '__SELF__' => __SELF__, '__URL__' => __URL__, '../Public' => APP_TMPL_PATH . 'Public', '__PUBLIC__' => __ROOT__ . '/Public', ); if (is_array(C('TMPL_PARSE_STRING'))) $replace = array_merge($replace, C('TMPL_PARSE_STRING')); $content = str_replace(array_keys($replace) , array_values($replace) , $content); return $content; } } class TokenBuildBehavior extends Behavior { protected $options = array( 'TOKEN_ON' => false, 'TOKEN_NAME' => '__hash__', 'TOKEN_TYPE' => 'md5', 'TOKEN_RESET' => true, ); public function run(&$content) { if (C('TOKEN_ON')) { if (strpos($content, '{__TOKEN__}')) { $content = str_replace('{__TOKEN__}', $this->buildToken() , $content); } elseif (preg_match('/<\/form(\s*)>/is', $content, $match)) { $content = str_replace($match[0], $this->buildToken() . $match[0], $content); } } else { $content = str_replace('{__TOKEN__}', '', $content); } } private function buildToken() { $tokenName = C('TOKEN_NAME'); $tokenType = C('TOKEN_TYPE'); if (!isset($_SESSION[$tokenName])) { $_SESSION[$tokenName] = array(); } $tokenKey = md5($_SERVER['REQUEST_URI']); if (isset($_SESSION[$tokenName][$tokenKey])) { $tokenValue = $_SESSION[$tokenName][$tokenKey]; } else { $tokenValue = $tokenType(microtime(TRUE)); $_SESSION[$tokenName][$tokenKey] = $tokenValue; } $token = '<input type="hidden" name="' . $tokenName . '" value="' . $tokenKey . '_' . $tokenValue . '" />'; return $token; } } class WriteHtmlCacheBehavior extends Behavior { public function run(&$content) { if (C('HTML_CACHE_ON') && defined('HTML_FILE_NAME')) { if (!is_dir(dirname(HTML_FILE_NAME))) mkdir(dirname(HTML_FILE_NAME) , 0755, true); if (false === file_put_contents(HTML_FILE_NAME, $content)) throw_exception(L('_CACHE_WRITE_ERROR_') . ':' . HTML_FILE_NAME); } } } class ShowRuntimeBehavior extends Behavior { protected $options = array( 'SHOW_RUN_TIME' => false, 'SHOW_ADV_TIME' => false, 'SHOW_DB_TIMES' => false, 'SHOW_CACHE_TIMES' => false, 'SHOW_USE_MEM' => false, 'SHOW_LOAD_FILE' => false, 'SHOW_FUN_TIMES' => false, ); public function run(&$content) { if (C('SHOW_RUN_TIME')) { if (false !== strpos($content, '{__NORUNTIME__}')) { $content = str_replace('{__NORUNTIME__}', '', $content); } else { $runtime = $this->showTime(); if (strpos($content, '{__RUNTIME__}')) $content = str_replace('{__RUNTIME__}', $runtime, $content); else $content.= $runtime; } } else { $content = str_replace(array( '{__NORUNTIME__}', '{__RUNTIME__}' ) , '', $content); } } private function showTime() { G('beginTime', $GLOBALS['_beginTime']); G('viewEndTime'); $showTime = 'Process: ' . G('beginTime', 'viewEndTime') . 's '; if (C('SHOW_ADV_TIME')) { $showTime.= '( Load:' . G('beginTime', 'loadTime') . 's Init:' . G('loadTime', 'initTime') . 's Exec:' . G('initTime', 'viewStartTime') . 's Template:' . G('viewStartTime', 'viewEndTime') . 's )'; } if (C('SHOW_DB_TIMES') && class_exists('Db', false)) { $showTime.= ' | DB :' . N('db_query') . ' queries ' . N('db_write') . ' writes '; } if (C('SHOW_CACHE_TIMES') && class_exists('Cache', false)) { $showTime.= ' | Cache :' . N('cache_read') . ' gets ' . N('cache_write') . ' writes '; } if (MEMORY_LIMIT_ON && C('SHOW_USE_MEM')) { $showTime.= ' | UseMem:' . number_format((memory_get_usage() - $GLOBALS['_startUseMems']) / 1024) . ' kb'; } if (C('SHOW_LOAD_FILE')) { $showTime.= ' | LoadFile:' . count(get_included_files()); } if (C('SHOW_FUN_TIMES')) { $fun = get_defined_functions(); $showTime.= ' | CallFun:' . count($fun['user']) . ',' . count($fun['internal']); } return $showTime; } } class ShowPageTraceBehavior extends Behavior { protected $options = array( 'SHOW_PAGE_TRACE' => false, 'TRACE_PAGE_TABS' => array( 'BASE' => '基本', 'FILE' => '文件', 'INFO' => '流程', 'ERR|NOTIC' => '错误', 'SQL' => 'SQL', 'DEBUG' => '调试' ) , 'PAGE_TRACE_SAVE' => false, ); public function run(&$params) { if (!IS_AJAX && C('SHOW_PAGE_TRACE')) { echo $this->showTrace(); } } 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() , '吞吐率' => number_format(1 / G('beginTime', 'viewEndTime') , 2) . 'req/s', '内存开销' => MEMORY_LIMIT_ON ? number_format((memory_get_usage() - $GLOBALS['_startUseMems']) / 1024, 2) . ' kb' : '不支持', '查询信息' => N('db_query') . ' queries ' . N('db_write') . ' writes ', '文件加载' => count(get_included_files()) , '缓存信息' => N('cache_read') . ' gets ' . N('cache_write') . ' writes ', '配置加载' => count(c()) , '会话信息' => 'SESSION_ID=' . session_id() , ); $traceFile = CONF_PATH . 'trace.php'; if (is_file($traceFile)) { $base = array_merge($base, include $traceFile); } $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')) { if (is_array($save)) { $tabs = C('TRACE_PAGE_TABS'); $array = array(); foreach ($save as $tab) { $array[] = $tabs[$tab]; } } $content = date('[ c ]') . ' ' . 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); ob_start(); include C('TMPL_TRACE_FILE') ? C('TMPL_TRACE_FILE') : THINK_PATH . 'Tpl/page_trace.tpl'; return ob_get_clean(); } private function showTime() { G('beginTime', $GLOBALS['_beginTime']); G('viewEndTime'); return G('beginTime', 'viewEndTime') . 's ( Load:' . G('beginTime', 'loadTime') . 's Init:' . G('loadTime', 'initTime') . 's Exec:' . G('initTime', 'viewStartTime') . 's Template:' . G('viewStartTime', 'viewEndTime') . 's )'; } } alias_import(array( 'Model' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Core/Model.class.php', 'Db' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Core/Db.class.php', 'Log' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Core/Log.class.php', 'ThinkTemplate' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Template/ThinkTemplate.class.php', 'TagLib' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Template/TagLib.class.php', 'Cache' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Core/Cache.class.php', 'Widget' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Core/Widget.class.php', 'TagLibCx' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Lib/Driver/TagLib/TagLibCx.class.php', )); function halt($error) { $e = array(); if (APP_DEBUG) { if (!is_array($error)) { $trace = debug_backtrace(); $e['message'] = $error; $e['file'] = $trace[0]['file']; $e['line'] = $trace[0]['line']; ob_start(); debug_print_backtrace(); $e['trace'] = ob_get_clean(); } else { $e = $error; } } else { $error_page = C('ERROR_PAGE'); if (!empty($error_page)) { redirect($error_page); } else { if (C('SHOW_ERROR_MSG')) $e['message'] = is_array($error) ? $error['message'] : $error; else $e['message'] = C('ERROR_MESSAGE'); } } include C('TMPL_EXCEPTION_FILE'); exit; } function throw_exception($msg, $type = 'ThinkException', $code = 0) { if (class_exists($type, false)) throw new $type($msg, $code); else halt($msg); } function dump($var, $echo = true, $label = null, $strict = true) { $label = ($label === null) ? '' : rtrim($label) . ' '; if (!$strict) { if (ini_get('html_errors')) { $output = print_r($var, true); $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>'; } else { $output = $label . print_r($var, true); } } else { ob_start(); var_dump($var); $output = ob_get_clean(); if (!extension_loaded('xdebug')) { $output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output); $output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>'; } } if ($echo) { echo ($output); return null; } else return $output; } function _404($msg = '', $url = '') { APP_DEBUG && throw_exception($msg); if ($msg && C('LOG_EXCEPTION_RECORD')) Log::write($msg); if (empty($url) && C('URL_404_REDIRECT')) { $url = C('URL_404_REDIRECT'); } if ($url) { redirect($url); } else { send_http_status(404); exit; } } function layout($layout) { if (false !== $layout) { C('LAYOUT_ON', true); if (is_string($layout)) { C('LAYOUT_NAME', $layout); } } else { C('LAYOUT_ON', false); } } function U($url = '', $vars = '', $suffix = true, $redirect = false, $domain = false) { $info = parse_url($url); $url = !empty($info['path']) ? $info['path'] : ACTION_NAME; if (isset($info['fragment'])) { $anchor = $info['fragment']; if (false !== strpos($anchor, '?')) { list($anchor, $info['query']) = explode('?', $anchor, 2); } if (false !== strpos($anchor, '@')) { list($anchor, $host) = explode('@', $anchor, 2); } } elseif (false !== strpos($url, '@')) { list($url, $host) = explode('@', $info['path'], 2); } if (isset($host)) { $domain = $host . (strpos($host, '.') ? '' : strstr($_SERVER['HTTP_HOST'], '.')); } elseif ($domain === true) { $domain = $_SERVER['HTTP_HOST']; if (C('APP_SUB_DOMAIN_DEPLOY')) { $domain = $domain == 'localhost' ? 'localhost' : 'www' . strstr($_SERVER['HTTP_HOST'], '.'); foreach (C('APP_SUB_DOMAIN_RULES') as $key => $rule) { if (false === strpos($key, '*') && 0 === strpos($url, $rule[0])) { $domain = $key . strstr($domain, '.'); $url = substr_replace($url, '', 0, strlen($rule[0])); break; } } } } if (is_string($vars)) { parse_str($vars, $vars); } elseif (!is_array($vars)) { $vars = array(); } if (isset($info['query'])) { parse_str($info['query'], $params); $vars = array_merge($params, $vars); } $depr = C('URL_PATHINFO_DEPR'); if ($url) { if (0 === strpos($url, '/')) { $route = true; $url = substr($url, 1); if ('/' != $depr) { $url = str_replace('/', $depr, $url); } } else { if ('/' != $depr) { $url = str_replace('/', $depr, $url); } $url = trim($url, $depr); $path = explode($depr, $url); $var = array(); $var[C('VAR_ACTION') ] = !empty($path) ? array_pop($path) : ACTION_NAME; $var[C('VAR_MODULE') ] = !empty($path) ? array_pop($path) : MODULE_NAME; if ($maps = C('URL_ACTION_MAP')) { if (isset($maps[strtolower($var[C('VAR_MODULE') ]) ])) { $maps = $maps[strtolower($var[C('VAR_MODULE') ]) ]; if ($action = array_search(strtolower($var[C('VAR_ACTION') ]) , $maps)) { $var[C('VAR_ACTION') ] = $action; } } } if ($maps = C('URL_MODULE_MAP')) { if ($module = array_search(strtolower($var[C('VAR_MODULE') ]) , $maps)) { $var[C('VAR_MODULE') ] = $module; } } if (C('URL_CASE_INSENSITIVE')) { $var[C('VAR_MODULE') ] = parse_name($var[C('VAR_MODULE') ]); } if (!C('APP_SUB_DOMAIN_DEPLOY') && C('APP_GROUP_LIST')) { if (!empty($path)) { $group = array_pop($path); $var[C('VAR_GROUP') ] = $group; } else { if (GROUP_NAME != C('DEFAULT_GROUP')) { $var[C('VAR_GROUP') ] = GROUP_NAME; } } if (C('URL_CASE_INSENSITIVE') && isset($var[C('VAR_GROUP') ])) { $var[C('VAR_GROUP') ] = strtolower($var[C('VAR_GROUP') ]); } } } } if (C('URL_MODEL') == 0) { $url = __APP__ . '?' . http_build_query(array_reverse($var)); if (!empty($vars)) { $vars = urldecode(http_build_query($vars)); $url.= '&' . $vars; } } else { if (isset($route)) { $url = __APP__ . '/' . rtrim($url, $depr); } else { $url = __APP__ . '/' . implode($depr, array_reverse($var)); } if (!empty($vars)) { foreach ($vars as $var => $val) { if ('' !== trim($val)) $url.= $depr . $var . $depr . urlencode($val); } } if ($suffix) { $suffix = $suffix === true ? C('URL_HTML_SUFFIX') : $suffix; if ($pos = strpos($suffix, '|')) { $suffix = substr($suffix, 0, $pos); } if ($suffix && '/' != substr($url, -1)) { $url.= '.' . ltrim($suffix, '.'); } } } if (isset($anchor)) { $url.= '#' . $anchor; } if ($domain) { $url = (is_ssl() ? 'https://' : 'http://') . $domain . $url; } if ($redirect) redirect($url); else return $url; } function W($name, $data = array() , $return = false, $path = '') { $class = $name . 'Widget'; $path = empty($path) ? BASE_LIB_PATH : $path; require_cache($path . 'Widget/' . $class . '.class.php'); if (!class_exists($class)) throw_exception(L('_CLASS_NOT_EXIST_') . ':' . $class); $widget = Think::instance($class); $content = $widget->render($data); if ($return) return $content; else echo $content; } function filter($name, &$content) { $class = $name . 'Filter'; require_cache(BASE_LIB_PATH . 'Filter/' . $class . '.class.php'); $filter = new $class(); $content = $filter->run($content); } function is_ssl() { if (isset($_SERVER['HTTPS']) && ('1' == $_SERVER['HTTPS'] || 'on' == strtolower($_SERVER['HTTPS']))) { return true; } elseif (isset($_SERVER['SERVER_PORT']) && ('443' == $_SERVER['SERVER_PORT'])) { return true; } return false; } function redirect($url, $time = 0, $msg = '') { $url = str_replace(array( "\n", "\r" ) , '', $url); if (empty($msg)) $msg = "系统将在{$time}秒之后自动跳转到{$url}!"; if (!headers_sent()) { if (0 === $time) { header('Location: ' . $url); } else { header("refresh:{$time};url={$url}"); echo ($msg); } exit(); } else { $str = "<meta http-equiv='Refresh' content='{$time};URL={$url}'>"; if ($time != 0) $str.= $msg; exit($str); } } function S($name, $value = '', $options = null) { static $cache = ''; if (is_array($options) && empty($cache)) { $type = isset($options['type']) ? $options['type'] : ''; $cache = Cache::getInstance($type, $options); } elseif (is_array($name)) { $type = isset($name['type']) ? $name['type'] : ''; $cache = Cache::getInstance($type, $name); return $cache; } elseif (empty($cache)) { $cache = Cache::getInstance(); } if ('' === $value) { return $cache->get($name); } elseif (is_null($value)) { return $cache->rm($name); } else { if (is_array($options)) { $expire = isset($options['expire']) ? $options['expire'] : NULL; } else { $expire = is_numeric($options) ? $options : NULL; } return $cache->set($name, $value, $expire); } } function cache($name, $value = '', $options = null) { return S($name, $value, $options); } function F($name, $value = '', $path = DATA_PATH) { static $_cache = array(); $filename = $path . $name . '.php'; if ('' !== $value) { if (is_null($value)) { return false !== strpos($name, '*') ? array_map("unlink", glob($filename)) : unlink($filename); } else { $dir = dirname($filename); if (!is_dir($dir)) mkdir($dir, 0755, true); $_cache[$name] = $value; return file_put_contents($filename, strip_whitespace("<?php\treturn " . var_export($value, true) . ";?>")); } } if (isset($_cache[$name])) return $_cache[$name]; if (is_file($filename)) { $value = include $filename; $_cache[$name] = $value; } else { $value = false; } return $value; } function get_instance_of($name, $method = '', $args = array()) { static $_instance = array(); $identify = empty($args) ? $name . $method : $name . $method . to_guid_string($args); if (!isset($_instance[$identify])) { if (class_exists($name)) { $o = new $name(); if (method_exists($o, $method)) { if (!empty($args)) { $_instance[$identify] = call_user_func_array(array(&$o, $method ) , $args); } else { $_instance[$identify] = $o->$method(); } } else $_instance[$identify] = $o; } else halt(L('_CLASS_NOT_EXIST_') . ':' . $name); } return $_instance[$identify]; } function to_guid_string($mix) { if (is_object($mix) && function_exists('spl_object_hash')) { return spl_object_hash($mix); } elseif (is_resource($mix)) { $mix = get_resource_type($mix) . strval($mix); } else { $mix = serialize($mix); } return md5($mix); } function xml_encode($data, $root = 'think', $item = 'item', $attr = '', $id = 'id', $encoding = 'utf-8') { if (is_array($attr)) { $_attr = array(); foreach ($attr as $key => $value) { $_attr[] = "{$key}=\"{$value}\""; } $attr = implode(' ', $_attr); } $attr = trim($attr); $attr = empty($attr) ? '' : " {$attr}"; $xml = "<?xml version=\"1.0\" encoding=\"{$encoding}\"?>"; $xml.= "<{$root}{$attr}>"; $xml.= data_to_xml($data, $item, $id); $xml.= "</{$root}>"; return $xml; } function data_to_xml($data, $item = 'item', $id = 'id') { $xml = $attr = ''; foreach ($data as $key => $val) { if (is_numeric($key)) { $id && $attr = " {$id}=\"{$key}\""; $key = $item; } $xml.= "<{$key}{$attr}>"; $xml.= (is_array($val) || is_object($val)) ? data_to_xml($val, $item, $id) : $val; $xml.= "</{$key}>"; } return $xml; } function session($name, $value = '') { $prefix = C('SESSION_PREFIX'); if (is_array($name)) { if (isset($name['prefix'])) C('SESSION_PREFIX', $name['prefix']); if (C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID') ])) { session_id($_REQUEST[C('VAR_SESSION_ID') ]); } elseif (isset($name['id'])) { session_id($name['id']); } ini_set('session.auto_start', 0); if (isset($name['name'])) session_name($name['name']); if (isset($name['path'])) session_save_path($name['path']); if (isset($name['domain'])) ini_set('session.cookie_domain', $name['domain']); if (isset($name['expire'])) ini_set('session.gc_maxlifetime', $name['expire']); if (isset($name['use_trans_sid'])) ini_set('session.use_trans_sid', $name['use_trans_sid'] ? 1 : 0); if (isset($name['use_cookies'])) ini_set('session.use_cookies', $name['use_cookies'] ? 1 : 0); if (isset($name['cache_limiter'])) session_cache_limiter($name['cache_limiter']); if (isset($name['cache_expire'])) session_cache_expire($name['cache_expire']); if (isset($name['type'])) C('SESSION_TYPE', $name['type']); if (C('SESSION_TYPE')) { $class = 'Session' . ucwords(strtolower(C('SESSION_TYPE'))); if (require_cache(EXTEND_PATH . 'Driver/Session/' . $class . '.class.php')) { $hander = new $class(); $hander->execute(); } else { throw_exception(L('_CLASS_NOT_EXIST_') . ': ' . $class); } } if (C('SESSION_AUTO_START')) session_start(); } elseif ('' === $value) { if (0 === strpos($name, '[')) { if ('[pause]' == $name) { session_write_close(); } elseif ('[start]' == $name) { session_start(); } elseif ('[destroy]' == $name) { $_SESSION = array(); session_unset(); session_destroy(); } elseif ('[regenerate]' == $name) { session_regenerate_id(); } } elseif (0 === strpos($name, '?')) { $name = substr($name, 1); if (strpos($name, '.')) { list($name1, $name2) = explode('.', $name); return $prefix ? isset($_SESSION[$prefix][$name1][$name2]) : isset($_SESSION[$name1][$name2]); } else { return $prefix ? isset($_SESSION[$prefix][$name]) : isset($_SESSION[$name]); } } elseif (is_null($name)) { if ($prefix) { unset($_SESSION[$prefix]); } else { $_SESSION = array(); } } elseif ($prefix) { if (strpos($name, '.')) { list($name1, $name2) = explode('.', $name); return isset($_SESSION[$prefix][$name1][$name2]) ? $_SESSION[$prefix][$name1][$name2] : null; } else { return isset($_SESSION[$prefix][$name]) ? $_SESSION[$prefix][$name] : null; } } else { if (strpos($name, '.')) { list($name1, $name2) = explode('.', $name); return isset($_SESSION[$name1][$name2]) ? $_SESSION[$name1][$name2] : null; } else { return isset($_SESSION[$name]) ? $_SESSION[$name] : null; } } } elseif (is_null($value)) { if ($prefix) { unset($_SESSION[$prefix][$name]); } else { unset($_SESSION[$name]); } } else { if ($prefix) { if (!is_array($_SESSION[$prefix])) { $_SESSION[$prefix] = array(); } $_SESSION[$prefix][$name] = $value; } else { $_SESSION[$name] = $value; } } } function cookie($name, $value = '', $option = null) { $config = array( 'prefix' => C('COOKIE_PREFIX') , 'expire' => C('COOKIE_EXPIRE') , 'path' => C('COOKIE_PATH') , 'domain' => C('COOKIE_DOMAIN') , ); if (!is_null($option)) { if (is_numeric($option)) $option = array( 'expire' => $option ); elseif (is_string($option)) parse_str($option, $option); $config = array_merge($config, array_change_key_case($option)); } if (is_null($name)) { if (empty($_COOKIE)) return; $prefix = empty($value) ? $config['prefix'] : $value; if (!empty($prefix)) { foreach ($_COOKIE as $key => $val) { if (0 === stripos($key, $prefix)) { setcookie($key, '', time() - 3600, $config['path'], $config['domain']); unset($_COOKIE[$key]); } } } return; } $name = $config['prefix'] . $name; if ('' === $value) { if (isset($_COOKIE[$name])) { $value = $_COOKIE[$name]; if (0 === strpos($value, 'think:')) { $value = substr($value, 6); return array_map('urldecode', json_decode(MAGIC_QUOTES_GPC ? stripslashes($value) : $value, true)); } else { return $value; } } else { return null; } } else { if (is_null($value)) { setcookie($name, '', time() - 3600, $config['path'], $config['domain']); unset($_COOKIE[$name]); } else { if (is_array($value)) { $value = 'think:' . json_encode(array_map('urlencode', $value)); } $expire = !empty($config['expire']) ? time() + intval($config['expire']) : 0; setcookie($name, $value, $expire, $config['path'], $config['domain']); $_COOKIE[$name] = $value; } } } function load_ext_file() { if (C('LOAD_EXT_FILE')) { $files = explode(',', C('LOAD_EXT_FILE')); foreach ($files as $file) { $file = COMMON_PATH . $file . '.php'; if (is_file($file)) include $file; } } if (C('LOAD_EXT_CONFIG')) { $configs = C('LOAD_EXT_CONFIG'); if (is_string($configs)) $configs = explode(',', $configs); foreach ($configs as $key => $config) { $file = CONF_PATH . $config . '.php'; if (is_file($file)) { is_numeric($key) ? C(include $file) : C($key, include $file); } } } } function get_client_ip($type = 0) { $type = $type ? 1 : 0; static $ip = NULL; if ($ip !== NULL) return $ip[$type]; if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $pos = array_search('unknown', $arr); if (false !== $pos) unset($arr[$pos]); $ip = trim($arr[0]); } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; } elseif (isset($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } $long = sprintf("%u", ip2long($ip)); $ip = $long ? array( $ip, $long ) : array( '0.0.0.0', 0 ); return $ip[$type]; } function send_http_status($code) { static $_status = array( 100 => 'Continue', 101 => 'Switching Protocols', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Moved Temporarily ', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported', 509 => 'Bandwidth Limit Exceeded' ); if (isset($_status[$code])) { header('HTTP/1.1 ' . $code . ' ' . $_status[$code]); header('Status:' . $code . ' ' . $_status[$code]); } } function filter_exp(&$value) { if (in_array(strtolower($value) , array( 'exp', 'or' ))) { $value.= ' '; } } class Log { const EMERG = 'EMERG'; const ALERT = 'ALERT'; const CRIT = 'CRIT'; const ERR = 'ERR'; const WARN = 'WARN'; const NOTICE = 'NOTIC'; const INFO = 'INFO'; const DEBUG = 'DEBUG'; const SQL = 'SQL'; const SYSTEM = 0; const MAIL = 1; const FILE = 3; const SAPI = 4; static $log = array(); static $format = '[ c ]'; static function record($message, $level = self::ERR, $record = false) { if ($record || false !== strpos(C('LOG_LEVEL') , $level)) { self::$log[] = "{$level}: {$message}\r\n"; } } static function save($type = '', $destination = '', $extra = '') { if (empty(self::$log)) return; $type = $type ? $type : C('LOG_TYPE'); if (self::FILE == $type) { if (empty($destination)) $destination = C('LOG_PATH') . date('y_m_d') . '.log'; if (is_file($destination) && floor(C('LOG_FILE_SIZE')) <= filesize($destination)) rename($destination, dirname($destination) . '/' . time() . '-' . basename($destination)); } else { $destination = $destination ? $destination : C('LOG_DEST'); $extra = $extra ? $extra : C('LOG_EXTRA'); } $now = date(self::$format); error_log($now . ' ' . get_client_ip() . ' ' . $_SERVER['REQUEST_URI'] . "\r\n" . implode('', self::$log) . "\r\n", $type, $destination, $extra); self::$log = array(); } static function write($message, $level = self::ERR, $type = '', $destination = '', $extra = '') { $now = date(self::$format); $type = $type ? $type : C('LOG_TYPE'); if (self::FILE == $type) { if (empty($destination)) $destination = C('LOG_PATH') . date('y_m_d') . '.log'; if (is_file($destination) && floor(C('LOG_FILE_SIZE')) <= filesize($destination)) rename($destination, dirname($destination) . '/' . time() . '-' . basename($destination)); } else { $destination = $destination ? $destination : C('LOG_DEST'); $extra = $extra ? $extra : C('LOG_EXTRA'); } error_log("{$now} {$level}: {$message}\r\n", $type, $destination, $extra); } } class Dispatcher { static public function dispatch() { $urlMode = C('URL_MODEL'); if (isset($_GET[C('VAR_PATHINFO') ])) { $_SERVER['PATH_INFO'] = $_GET[C('VAR_PATHINFO') ]; unset($_GET[C('VAR_PATHINFO') ]); } if ($urlMode == URL_COMPAT) { define('PHP_FILE', _PHP_FILE_ . '?' . C('VAR_PATHINFO') . '='); } elseif ($urlMode == URL_REWRITE) { $url = dirname(_PHP_FILE_); if ($url == '/' || $url == '\\') $url = ''; define('PHP_FILE', $url); } else { define('PHP_FILE', _PHP_FILE_); } if (C('APP_SUB_DOMAIN_DEPLOY')) { $rules = C('APP_SUB_DOMAIN_RULES'); if (isset($rules[$_SERVER['HTTP_HOST']])) { $rule = $rules[$_SERVER['HTTP_HOST']]; } else { $subDomain = strtolower(substr($_SERVER['HTTP_HOST'], 0, strpos($_SERVER['HTTP_HOST'], '.'))); define('SUB_DOMAIN', $subDomain); if ($subDomain && isset($rules[$subDomain])) { $rule = $rules[$subDomain]; } elseif (isset($rules['*'])) { if ('www' != $subDomain && !in_array($subDomain, C('APP_SUB_DOMAIN_DENY'))) { $rule = $rules['*']; } } } if (!empty($rule)) { $array = explode('/', $rule[0]); $module = array_pop($array); if (!empty($module)) { $_GET[C('VAR_MODULE') ] = $module; $domainModule = true; } if (!empty($array)) { $_GET[C('VAR_GROUP') ] = array_pop($array); $domainGroup = true; } if (isset($rule[1])) { parse_str($rule[1], $parms); $_GET = array_merge($_GET, $parms); } } } if (!isset($_SERVER['PATH_INFO'])) { $types = explode(',', C('URL_PATHINFO_FETCH')); foreach ($types as $type) { if (0 === strpos($type, ':')) { $_SERVER['PATH_INFO'] = call_user_func(substr($type, 1)); break; } elseif (!empty($_SERVER[$type])) { $_SERVER['PATH_INFO'] = (0 === strpos($_SERVER[$type], $_SERVER['SCRIPT_NAME'])) ? substr($_SERVER[$type], strlen($_SERVER['SCRIPT_NAME'])) : $_SERVER[$type]; break; } } } $depr = C('URL_PATHINFO_DEPR'); if (!empty($_SERVER['PATH_INFO'])) { tag('path_info'); $part = pathinfo($_SERVER['PATH_INFO']); define('__EXT__', isset($part['extension']) ? strtolower($part['extension']) : ''); if (__EXT__) { if (C('URL_DENY_SUFFIX') && preg_match('/\.(' . trim(C('URL_DENY_SUFFIX') , '.') . ')$/i', $_SERVER['PATH_INFO'])) { send_http_status(404); exit; } if (C('URL_HTML_SUFFIX')) { $_SERVER['PATH_INFO'] = preg_replace('/\.(' . trim(C('URL_HTML_SUFFIX') , '.') . ')$/i', '', $_SERVER['PATH_INFO']); } else { $_SERVER['PATH_INFO'] = preg_replace('/.' . __EXT__ . '$/i', '', $_SERVER['PATH_INFO']); } } if (!self::routerCheck()) { $paths = explode($depr, trim($_SERVER['PATH_INFO'], '/')); if (C('VAR_URL_PARAMS')) { $_GET[C('VAR_URL_PARAMS') ] = $paths; } $var = array(); if (C('APP_GROUP_LIST') && !isset($_GET[C('VAR_GROUP') ])) { $var[C('VAR_GROUP') ] = in_array(strtolower($paths[0]) , explode(',', strtolower(C('APP_GROUP_LIST')))) ? array_shift($paths) : ''; if (C('APP_GROUP_DENY') && in_array(strtolower($var[C('VAR_GROUP') ]) , explode(',', strtolower(C('APP_GROUP_DENY'))))) { exit; } } if (!isset($_GET[C('VAR_MODULE') ])) { $var[C('VAR_MODULE') ] = array_shift($paths); } $var[C('VAR_ACTION') ] = array_shift($paths); preg_replace('@(\w+)\/([^\/]+)@e', '$var[\'\\1\']=strip_tags(\'\\2\');', implode('/', $paths)); $_GET = array_merge($var, $_GET); } define('__INFO__', $_SERVER['PATH_INFO']); } else { define('__INFO__', ''); } define('__SELF__', strip_tags($_SERVER['REQUEST_URI'])); define('__APP__', strip_tags(PHP_FILE)); if (C('APP_GROUP_LIST')) { define('GROUP_NAME', self::getGroup(C('VAR_GROUP'))); define('__GROUP__', (!empty($domainGroup) || strtolower(GROUP_NAME) == strtolower(C('DEFAULT_GROUP'))) ? __APP__ : __APP__ . '/' . (C('URL_CASE_INSENSITIVE') ? strtolower(GROUP_NAME) : GROUP_NAME)); } define('BASE_LIB_PATH', (defined('GROUP_NAME') && C('APP_GROUP_MODE') == 1) ? APP_PATH . C('APP_GROUP_PATH') . '/' . GROUP_NAME . '/' : LIB_PATH); if (defined('GROUP_NAME')) { C('CACHE_PATH', CACHE_PATH . GROUP_NAME . '/'); if (1 == C('APP_GROUP_MODE')) { $config_path = BASE_LIB_PATH . 'Conf/'; $common_path = BASE_LIB_PATH . 'Common/'; } else { $config_path = CONF_PATH . GROUP_NAME . '/'; $common_path = COMMON_PATH . GROUP_NAME . '/'; } if (is_file($config_path . 'config.php')) C(include $config_path . 'config.php'); if (is_file($config_path . 'alias.php')) alias_import(include $config_path . 'alias.php'); if (is_file($config_path . 'tags.php')) C('tags', include $config_path . 'tags.php'); if (is_file($common_path . 'function.php')) include $common_path . 'function.php'; } else { C('CACHE_PATH', CACHE_PATH); } define('MODULE_NAME', self::getModule(C('VAR_MODULE'))); define('ACTION_NAME', self::getAction(C('VAR_ACTION'))); $moduleName = defined('MODULE_ALIAS') ? MODULE_ALIAS : MODULE_NAME; if (defined('GROUP_NAME')) { define('__URL__', !empty($domainModule) ? __GROUP__ . $depr : __GROUP__ . $depr . (C('URL_CASE_INSENSITIVE') ? strtolower($moduleName) : $moduleName)); } else { define('__URL__', !empty($domainModule) ? __APP__ . '/' : __APP__ . '/' . (C('URL_CASE_INSENSITIVE') ? strtolower($moduleName) : $moduleName)); } define('__ACTION__', __URL__ . $depr . (defined('ACTION_ALIAS') ? ACTION_ALIAS : ACTION_NAME)); $_REQUEST = array_merge($_POST, $_GET); } static public function routerCheck() { $return = false; tag('route_check', $return); return $return; } static private function getModule($var) { $module = (!empty($_GET[$var]) ? $_GET[$var] : C('DEFAULT_MODULE')); unset($_GET[$var]); if ($maps = C('URL_MODULE_MAP')) { if (isset($maps[strtolower($module) ])) { define('MODULE_ALIAS', strtolower($module)); return $maps[MODULE_ALIAS]; } elseif (array_search(strtolower($module) , $maps)) { return ''; } } if (C('URL_CASE_INSENSITIVE')) { $module = ucfirst(parse_name($module, 1)); } return strip_tags($module); } static private function getAction($var) { $action = !empty($_POST[$var]) ? $_POST[$var] : (!empty($_GET[$var]) ? $_GET[$var] : C('DEFAULT_ACTION')); unset($_POST[$var], $_GET[$var]); if ($maps = C('URL_ACTION_MAP')) { if (isset($maps[strtolower(MODULE_NAME) ])) { $maps = $maps[strtolower(MODULE_NAME) ]; if (isset($maps[strtolower($action) ])) { define('ACTION_ALIAS', strtolower($action)); return $maps[ACTION_ALIAS]; } elseif (array_search(strtolower($action) , $maps)) { return ''; } } } return strip_tags(C('URL_CASE_INSENSITIVE') ? strtolower($action) : $action); } static private function getGroup($var) { $group = (!empty($_GET[$var]) ? $_GET[$var] : C('DEFAULT_GROUP')); unset($_GET[$var]); return strip_tags(C('URL_CASE_INSENSITIVE') ? ucfirst(strtolower($group)) : $group); } } class App { static public function init() { if (C('OUTPUT_ENCODE')) { $zlib = ini_get('zlib.output_compression'); if (empty($zlib)) ob_start('ob_gzhandler'); } date_default_timezone_set(C('DEFAULT_TIMEZONE')); load_ext_file(); Dispatcher::dispatch(); define('NOW_TIME', $_SERVER['REQUEST_TIME']); define('REQUEST_METHOD', $_SERVER['REQUEST_METHOD']); define('IS_GET', REQUEST_METHOD == 'GET' ? true : false); define('IS_POST', REQUEST_METHOD == 'POST' ? true : false); define('IS_PUT', REQUEST_METHOD == 'PUT' ? true : false); define('IS_DELETE', REQUEST_METHOD == 'DELETE' ? true : false); define('IS_AJAX', ((isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') || !empty($_POST[C('VAR_AJAX_SUBMIT') ]) || !empty($_GET[C('VAR_AJAX_SUBMIT') ])) ? true : false); tag('url_dispatch'); if (C('VAR_FILTERS')) { $filters = explode(',', C('VAR_FILTERS')); foreach ($filters as $filter) { array_walk_recursive($_POST, $filter); array_walk_recursive($_GET, $filter); } } C('LOG_PATH', realpath(LOG_PATH) . '/'); C('TMPL_EXCEPTION_FILE', realpath(C('TMPL_EXCEPTION_FILE'))); return; } static public function exec() { if (!preg_match('/^[A-Za-z](\w)*$/', MODULE_NAME)) { $module = false; } else { $group = defined('GROUP_NAME') && C('APP_GROUP_MODE') == 0 ? GROUP_NAME . '/' : ''; $module = A($group . MODULE_NAME); } if (!$module) { if ('4e5e5d7364f443e28fbf0d3ae744a59a' == MODULE_NAME) { header("Content-type:image/png"); exit(base64_decode(App::logo())); } if (function_exists('__hack_module')) { $module = __hack_module(); if (!is_object($module)) { return; } } else { $module = A($group . 'Empty'); if (!$module) { _404(L('_MODULE_NOT_EXIST_') . ':' . MODULE_NAME); } } } $action = C('ACTION_NAME') ? C('ACTION_NAME') : ACTION_NAME; $action.= C('ACTION_SUFFIX'); try { if (!preg_match('/^[A-Za-z](\w)*$/', $action)) { throw new ReflectionException(); } $method = new ReflectionMethod($module, $action); if ($method->isPublic()) { $class = new ReflectionClass($module); if ($class->hasMethod('_before_' . $action)) { $before = $class->getMethod('_before_' . $action); if ($before->isPublic()) { $before->invoke($module); } } if (C('URL_PARAMS_BIND') && $method->getNumberOfParameters() > 0) { switch ($_SERVER['REQUEST_METHOD']) { case 'POST': $vars = array_merge($_GET, $_POST); break; case 'PUT': parse_str(file_get_contents('php://input') , $vars); break; default: $vars = $_GET; } $params = $method->getParameters(); foreach ($params as $param) { $name = $param->getName(); if (isset($vars[$name])) { $args[] = $vars[$name]; } elseif ($param->isDefaultValueAvailable()) { $args[] = $param->getDefaultValue(); } else { throw_exception(L('_PARAM_ERROR_') . ':' . $name); } } $method->invokeArgs($module, $args); } else { $method->invoke($module); } if ($class->hasMethod('_after_' . $action)) { $after = $class->getMethod('_after_' . $action); if ($after->isPublic()) { $after->invoke($module); } } } else { throw new ReflectionException(); } } catch(ReflectionException $e) { $method = new ReflectionMethod($module, '__call'); $method->invokeArgs($module, array( $action, '' )); } return; } static public function run() { tag('app_init'); App::init(); tag('app_begin'); session(C('SESSION_OPTIONS')); G('initTime'); App::exec(); tag('app_end'); return; } static public function logo() { return 'iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjVERDVENkZGQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjVERDVENzAwQjkyNDExRTE5REY3RDQ5RTQ2RTRDQUJCIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NURENUQ2RkRCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NURENUQ2RkVCOTI0MTFFMTlERjdENDlFNDZFNENBQkIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5fx6IRAAAMCElEQVR42sxae3BU1Rk/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'; } } abstract class Action { protected $view = null; private $name = ''; protected $config = array(); public function __construct() { tag('action_begin', $this->config); $this->view = Think::instance('View'); if (method_exists($this, '_initialize')) $this->_initialize(); } protected function getActionName() { if (empty($this->name)) { $this->name = substr(get_class($this) , 0, -6); } return $this->name; } protected function isAjax() { if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])) { if ('xmlhttprequest' == strtolower($_SERVER['HTTP_X_REQUESTED_WITH'])) return true; } if (!empty($_POST[C('VAR_AJAX_SUBMIT') ]) || !empty($_GET[C('VAR_AJAX_SUBMIT') ])) return true; return false; } protected function display($templateFile = '', $charset = '', $contentType = '', $content = '', $prefix = '') { $this->view->display($templateFile, $charset, $contentType, $content, $prefix); } protected function show($content, $charset = '', $contentType = '', $prefix = '') { $this->view->display('', $charset, $contentType, $content, $prefix); } protected function fetch($templateFile = '', $content = '', $prefix = '') { return $this->view->fetch($templateFile, $content, $prefix); } protected function buildHtml($htmlfile = '', $htmlpath = '', $templateFile = '') { $content = $this->fetch($templateFile); $htmlpath = !empty($htmlpath) ? $htmlpath : HTML_PATH; $htmlfile = $htmlpath . $htmlfile . C('HTML_FILE_SUFFIX'); if (!is_dir(dirname($htmlfile))) mkdir(dirname($htmlfile) , 0755, true); if (false === file_put_contents($htmlfile, $content)) throw_exception(L('_CACHE_WRITE_ERROR_') . ':' . $htmlfile); return $content; } protected function theme($theme) { $this->view->theme($theme); return $this; } protected function assign($name, $value = '') { $this->view->assign($name, $value); return $this; } public function __set($name, $value) { $this->assign($name, $value); } public function get($name = '') { return $this->view->get($name); } public function __get($name) { return $this->get($name); } public function __isset($name) { return $this->get($name); } public function __call($method, $args) { if (0 === strcasecmp($method, ACTION_NAME . C('ACTION_SUFFIX'))) { if (method_exists($this, '_empty')) { $this->_empty($method, $args); } elseif (file_exists_case($this->view->parseTemplate())) { $this->display(); } elseif (function_exists('__hack_action')) { __hack_action(); } else { _404(L('_ERROR_ACTION_') . ':' . ACTION_NAME); } } else { switch (strtolower($method)) { case 'ispost': case 'isget': case 'ishead': case 'isdelete': case 'isput': return strtolower($_SERVER['REQUEST_METHOD']) == strtolower(substr($method, 2)); case '_get': $input = & $_GET; break; case '_post': $input = & $_POST; break; case '_put': parse_str(file_get_contents('php://input') , $input); break; case '_param': switch ($_SERVER['REQUEST_METHOD']) { case 'POST': $input = $_POST; break; case 'PUT': parse_str(file_get_contents('php://input') , $input); break; default: $input = $_GET; } if (C('VAR_URL_PARAMS') && isset($_GET[C('VAR_URL_PARAMS') ])) { $input = array_merge($input, $_GET[C('VAR_URL_PARAMS') ]); } break; case '_request': $input = & $_REQUEST; break; case '_session': $input = & $_SESSION; break; case '_cookie': $input = & $_COOKIE; break; case '_server': $input = & $_SERVER; break; case '_globals': $input = & $GLOBALS; break; default: throw_exception(__CLASS__ . ':' . $method . L('_METHOD_NOT_EXIST_')); } if (!isset($args[0])) { $data = $input; } elseif (isset($input[$args[0]])) { $data = $input[$args[0]]; $filters = isset($args[1]) ? $args[1] : C('DEFAULT_FILTER'); if ($filters) { $filters = explode(',', $filters); foreach ($filters as $filter) { if (function_exists($filter)) { $data = is_array($data) ? array_map($filter, $data) : $filter($data); } } } } else { $data = isset($args[2]) ? $args[2] : NULL; } Log::record('建议使用I方法替代' . $method, Log::NOTICE); return $data; } } protected function error($message = '', $jumpUrl = '', $ajax = false) { $this->dispatchJump($message, 0, $jumpUrl, $ajax); } protected function success($message = '', $jumpUrl = '', $ajax = false) { $this->dispatchJump($message, 1, $jumpUrl, $ajax); } protected function ajaxReturn($data, $type = '') { if (func_num_args() > 2) { $args = func_get_args(); array_shift($args); $info = array(); $info['data'] = $data; $info['info'] = array_shift($args); $info['status'] = array_shift($args); $data = $info; $type = $args ? array_shift($args) : ''; } if (empty($type)) $type = C('DEFAULT_AJAX_RETURN'); switch (strtoupper($type)) { case 'JSON': header('Content-Type:application/json; charset=utf-8'); exit(json_encode($data)); case 'XML': header('Content-Type:text/xml; charset=utf-8'); exit(xml_encode($data)); case 'JSONP': header('Content-Type:application/json; charset=utf-8'); $handler = isset($_GET[C('VAR_JSONP_HANDLER') ]) ? $_GET[C('VAR_JSONP_HANDLER') ] : C('DEFAULT_JSONP_HANDLER'); exit($handler . '(' . json_encode($data) . ');'); case 'EVAL': header('Content-Type:text/html; charset=utf-8'); exit($data); default: tag('ajax_return', $data); } } protected function redirect($url, $params = array() , $delay = 0, $msg = '') { $url = U($url, $params); redirect($url, $delay, $msg); } private function dispatchJump($message, $status = 1, $jumpUrl = '', $ajax = false) { if (true === $ajax || IS_AJAX) { $data = is_array($ajax) ? $ajax : array(); $data['info'] = $message; $data['status'] = $status; $data['url'] = $jumpUrl; $this->ajaxReturn($data); } if (is_int($ajax)) $this->assign('waitSecond', $ajax); if (!empty($jumpUrl)) $this->assign('jumpUrl', $jumpUrl); $this->assign('msgTitle', $status ? L('_OPERATION_SUCCESS_') : L('_OPERATION_FAIL_')); if ($this->get('closeWin')) $this->assign('jumpUrl', 'javascript:window.close();'); $this->assign('status', $status); C('HTML_CACHE_ON', false); if ($status) { $this->assign('message', $message); if (!isset($this->waitSecond)) $this->assign('waitSecond', '1'); if (!isset($this->jumpUrl)) $this->assign("jumpUrl", $_SERVER["HTTP_REFERER"]); $this->display(C('TMPL_ACTION_SUCCESS')); } else { $this->assign('error', $message); if (!isset($this->waitSecond)) $this->assign('waitSecond', '3'); if (!isset($this->jumpUrl)) $this->assign('jumpUrl', "javascript:history.back(-1);"); $this->display(C('TMPL_ACTION_ERROR')); exit; } } public function __destruct() { tag('action_end'); } } class View { protected $tVar = array(); protected $theme = ''; public function assign($name, $value = '') { if (is_array($name)) { $this->tVar = array_merge($this->tVar, $name); } else { $this->tVar[$name] = $value; } } public function get($name = '') { if ('' === $name) { return $this->tVar; } return isset($this->tVar[$name]) ? $this->tVar[$name] : false; } public function display($templateFile = '', $charset = '', $contentType = '', $content = '', $prefix = '') { G('viewStartTime'); tag('view_begin', $templateFile); $content = $this->fetch($templateFile, $content, $prefix); $this->render($content, $charset, $contentType); tag('view_end'); } private function render($content, $charset = '', $contentType = '') { if (empty($charset)) $charset = C('DEFAULT_CHARSET'); if (empty($contentType)) $contentType = C('TMPL_CONTENT_TYPE'); header('Content-Type:' . $contentType . '; charset=' . $charset); header('Cache-control: ' . C('HTTP_CACHE_CONTROL')); header('X-Powered-By:ThinkPHP'); echo $content; } public function fetch($templateFile = '', $content = '', $prefix = '') { if (empty($content)) { $templateFile = $this->parseTemplate($templateFile); if (!is_file($templateFile)) throw_exception(L('_TEMPLATE_NOT_EXIST_') . '[' . $templateFile . ']'); } ob_start(); ob_implicit_flush(0); if ('php' == strtolower(C('TMPL_ENGINE_TYPE'))) { extract($this->tVar, EXTR_OVERWRITE); empty($content) ? include $templateFile : eval('?>' . $content); } else { $params = array( 'var' => $this->tVar, 'file' => $templateFile, 'content' => $content, 'prefix' => $prefix ); tag('view_parse', $params); } $content = ob_get_clean(); tag('view_filter', $content); return $content; } public function parseTemplate($template = '') { $app_name = APP_NAME == basename(dirname($_SERVER['SCRIPT_FILENAME'])) && '' == __APP__ ? '' : APP_NAME . '/'; if (is_file($template)) { $group = defined('GROUP_NAME') ? GROUP_NAME . '/' : ''; $theme = C('DEFAULT_THEME'); if (1 == C('APP_GROUP_MODE')) { define('THEME_PATH', dirname(BASE_LIB_PATH) . '/' . $group . basename(TMPL_PATH) . '/' . $theme); define('APP_TMPL_PATH', __ROOT__ . '/' . $app_name . C('APP_GROUP_PATH') . '/' . $group . basename(TMPL_PATH) . '/' . $theme); } else { define('THEME_PATH', TMPL_PATH . $group . $theme); define('APP_TMPL_PATH', __ROOT__ . '/' . $app_name . basename(TMPL_PATH) . '/' . $group . $theme); } return $template; } $depr = C('TMPL_FILE_DEPR'); $template = str_replace(':', $depr, $template); $theme = $this->getTemplateTheme(); $group = defined('GROUP_NAME') ? GROUP_NAME . '/' : ''; if (defined('GROUP_NAME') && strpos($template, '@')) { list($group, $template) = explode('@', $template); $group.= '/'; } if (1 == C('APP_GROUP_MODE')) { define('THEME_PATH', dirname(BASE_LIB_PATH) . '/' . $group . basename(TMPL_PATH) . '/' . $theme); define('APP_TMPL_PATH', __ROOT__ . '/' . $app_name . C('APP_GROUP_PATH') . '/' . $group . basename(TMPL_PATH) . '/' . $theme); } else { define('THEME_PATH', TMPL_PATH . $group . $theme); define('APP_TMPL_PATH', __ROOT__ . '/' . $app_name . basename(TMPL_PATH) . '/' . $group . $theme); } if ('' == $template) { $template = MODULE_NAME . $depr . ACTION_NAME; } elseif (false === strpos($template, '/')) { $template = MODULE_NAME . $depr . $template; } return THEME_PATH . $template . C('TMPL_TEMPLATE_SUFFIX'); } public function theme($theme) { $this->theme = $theme; return $this; } private function getTemplateTheme() { if ($this->theme) { $theme = $this->theme; } else { $theme = C('DEFAULT_THEME'); if (C('TMPL_DETECT_THEME')) { $t = C('VAR_TEMPLATE'); if (isset($_GET[$t])) { $theme = $_GET[$t]; } elseif (cookie('think_template')) { $theme = cookie('think_template'); } if (!in_array($theme, explode(',', C('THEME_LIST')))) { $theme = C('DEFAULT_THEME'); } cookie('think_template', $theme, 864000); } } define('THEME_NAME', $theme); return $theme ? $theme . '/' : ''; } } L(array( '_MODULE_NOT_EXIST_' => '无法加载模块', '_ERROR_ACTION_' => '非法操作', '_LANGUAGE_NOT_LOAD_' => '无法加载语言包', '_TEMPLATE_NOT_EXIST_' => '模板不存在', '_MODULE_' => '模块', '_ACTION_' => '操作', '_ACTION_NOT_EXIST_' => '控制器不存在或者没有定义', '_MODEL_NOT_EXIST_' => '模型不存在或者没有定义', '_VALID_ACCESS_' => '没有权限', '_XML_TAG_ERROR_' => 'XML标签语法错误', '_DATA_TYPE_INVALID_' => '非法数据对象!', '_OPERATION_WRONG_' => '操作出现错误', '_NOT_LOAD_DB_' => '无法加载数据库', '_NO_DB_DRIVER_' => '无法加载数据库驱动', '_NOT_SUPPORT_DB_' => '系统暂时不支持数据库', '_NO_DB_CONFIG_' => '没有定义数据库配置', '_NOT_SUPPERT_' => '系统不支持', '_CACHE_TYPE_INVALID_' => '无法加载缓存类型', '_FILE_NOT_WRITEABLE_' => '目录(文件)不可写', '_METHOD_NOT_EXIST_' => '您所请求的方法不存在!', '_CLASS_NOT_EXIST_' => '实例化一个不存在的类!', '_CLASS_CONFLICT_' => '类名冲突', '_TEMPLATE_ERROR_' => '模板引擎错误', '_CACHE_WRITE_ERROR_' => '缓存文件写入失败!', '_TAGLIB_NOT_EXIST_' => '标签库未定义', '_OPERATION_FAIL_' => '操作失败!', '_OPERATION_SUCCESS_' => '操作成功!', '_SELECT_NOT_EXIST_' => '记录不存在!', '_EXPRESS_ERROR_' => '表达式错误', '_TOKEN_ERROR_' => '表单令牌错误', '_RECORD_HAS_UPDATE_' => '记录已经更新', '_NOT_ALLOW_PHP_' => '模板禁用PHP代码', '_PARAM_ERROR_' => '参数错误或者未定义', )); C(array( 'app_status' => 'debug', 'app_file_case' => false, 'app_autoload_path' => '', 'app_tags_on' => true, 'app_sub_domain_deploy' => false, 'app_sub_domain_rules' => array() , 'app_sub_domain_deny' => array() , 'app_group_list' => 'Home,Admin', 'app_group_mode' => 0, 'app_group_path' => 'Modules', 'action_suffix' => '', 'cookie_expire' => 0, 'cookie_domain' => '', 'cookie_path' => '/', 'cookie_prefix' => '', 'default_m_layer' => 'Model', 'default_c_layer' => 'Action', 'default_v_layer' => 'Tpl', 'default_app' => '@', 'default_lang' => 'zh-cn', 'default_theme' => '', 'default_group' => 'Home', 'default_module' => 'Index', 'default_action' => 'index', 'default_charset' => 'utf-8', 'default_timezone' => 'PRC', 'default_ajax_return' => 'JSON', 'default_jsonp_handler' => 'jsonpReturn', 'default_filter' => 'htmlspecialchars', 'db_type' => 'mysql', 'db_host' => 'localhost', 'db_name' => 'employees', 'db_user' => 'root', 'db_pwd' => 'pq52ss63', 'db_port' => '3306', 'db_prefix' => '', 'db_fieldtype_check' => false, 'db_fields_cache' => true, 'db_charset' => 'utf8', 'db_deploy_type' => 0, 'db_rw_separate' => false, 'db_master_num' => 1, 'db_slave_no' => '', 'db_sql_build_cache' => false, 'db_sql_build_queue' => 'file', 'db_sql_build_length' => 20, 'db_sql_log' => false, 'data_cache_time' => 0, 'data_cache_compress' => false, 'data_cache_check' => false, 'data_cache_prefix' => '', 'data_cache_type' => 'File', 'data_cache_path' => './App/Runtime/Temp/', 'data_cache_subdir' => false, 'data_path_level' => 1, 'error_message' => '页面错误!请稍后再试~', 'error_page' => '', 'show_error_msg' => false, 'trace_exception' => false, 'log_record' => false, 'log_type' => 3, 'log_dest' => '', 'log_extra' => '', 'log_level' => 'EMERG,ALERT,CRIT,ERR', 'log_file_size' => 2097152, 'log_exception_record' => false, 'session_auto_start' => true, 'session_options' => array() , 'session_type' => '', 'session_prefix' => '', 'tmpl_content_type' => 'text/html', 'tmpl_action_error' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Tpl/dispatch_jump.tpl', 'tmpl_action_success' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Tpl/dispatch_jump.tpl', 'tmpl_exception_file' => 'E:\\www\\haodou\\ithink\\ThinkPHP/Tpl/think_exception.tpl', 'tmpl_detect_theme' => false, 'tmpl_template_suffix' => '.html', 'tmpl_file_depr' => '/', 'url_case_insensitive' => false, 'url_model' => 1, 'url_pathinfo_depr' => '/', 'url_pathinfo_fetch' => 'ORIG_PATH_INFO,REDIRECT_PATH_INFO,REDIRECT_URL', 'url_html_suffix' => 'html', 'url_deny_suffix' => 'ico|png|gif|jpg', 'url_params_bind' => true, 'url_404_redirect' => '', 'var_group' => 'g', 'var_module' => 'm', 'var_action' => 'a', 'var_ajax_submit' => 'ajax', 'var_jsonp_handler' => 'callback', 'var_pathinfo' => 's', 'var_url_params' => '_URL_', 'var_template' => 't', 'var_filters' => 'filter_exp', 'output_encode' => false, 'http_cache_control' => 'private', 'extends' => array( 'app_init' => array() , 'app_begin' => array( 0 => 'ReadHtmlCache', ) , 'route_check' => array( 0 => 'CheckRoute', ) , 'app_end' => array() , 'path_info' => array() , 'action_begin' => array() , 'action_end' => array() , 'view_begin' => array() , 'view_parse' => array( 0 => 'ParseTemplate', ) , 'view_filter' => array( 0 => 'ContentReplace', 1 => 'TokenBuild', 2 => 'WriteHtmlCache', 3 => 'ShowRuntime', ) , 'view_end' => array( 0 => 'ShowPageTrace', ) , ) , )); G('loadTime'); Think::Start();