private static function requireHtmlCache() { // 分析当前的静态规则 $htmls = C('_htmls_'); // 读取静态规则 if (!empty($htmls)) { // 静态规则文件定义格式 actionName=>array(‘静态规则’,’缓存时间’,’附加规则') // 'read'=>array('{id},{name}',60,'md5') 必须保证静态规则的唯一性 和 可判断性 // 检测静态规则 if (isset($htmls[strtolower(GROUP_NAME . ':' . MODULE_NAME . ':' . ACTION_NAME)])) { $html = $htmls[strtolower(GROUP_NAME . ':' . MODULE_NAME . ':' . ACTION_NAME)]; // 某个模块的操作的静态规则 } elseif (isset($htmls[MODULE_NAME . ':' . ACTION_NAME])) { $html = $htmls[MODULE_NAME . ':' . ACTION_NAME]; // 某个模块的操作的静态规则 } elseif (isset($htmls[MODULE_NAME . ':'])) { // 某个模块的静态规则 $html = $htmls[MODULE_NAME . ':']; } elseif (isset($htmls[ACTION_NAME])) { $html = $htmls[ACTION_NAME]; // 所有操作的静态规则 } elseif (isset($htmls['*'])) { $html = $htmls['*']; // 全局静态规则 } elseif (isset($htmls['Empty:index']) && !class_exists(MODULE_NAME . 'Action')) { $html = $htmls['Empty:index']; // 空模块静态规则 } elseif (isset($htmls[MODULE_NAME . ':_empty']) && self::isEmptyAction(MODULE_NAME, ACTION_NAME)) { $html = $htmls[MODULE_NAME . ':_empty']; // 空操作静态规则 } if (!empty($html)) { self::$requireCache = true; // 需要缓存 // 解读静态规则 $rule = $html[0]; // 以$_开头的系统变量 $rule = preg_replace('/{\\$(_\\w+)\\.(\\w+)\\|(\\w+)}/e', "\\3(\$\\1['\\2'])", $rule); $rule = preg_replace('/{\\$(_\\w+)\\.(\\w+)}/e', "\$\\1['\\2']", $rule); // {ID|FUN} GET变量的简写 $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); // {|FUN} 单独使用函数 $rule = preg_replace('/{|(\\w+)}/e', "\\1()", $rule); if (!empty($html[2])) { $rule = $html[2]($rule); } // 应用附加函数 self::$cacheTime = isset($html[1]) ? $html[1] : C('HTML_CACHE_TIME'); // 缓存有效期 // 当前缓存文件 define('HTML_FILE_NAME', HTML_PATH . $rule . C('HTML_FILE_SUFFIX')); return true; } } // 无需缓存 return false; }
/** +---------------------------------------------------------- * 读取静态缓存 +---------------------------------------------------------- * @access static +---------------------------------------------------------- * @return void +---------------------------------------------------------- * @throws ThinkExecption +---------------------------------------------------------- */ static function readHTMLCache() { if (file_exists(CONFIG_PATH . '_htmls.php')) { // 读取静态规则文件 // 静态规则文件定义格式 actionName=>array(‘静态规则’,’缓存时间’,’附加规则') // 'read'=>array('{id},{name}',60,'md5') 必须保证静态规则的唯一性 和 可判断性 $htmls = (include CONFIG_PATH . '_htmls.php'); if (!is_array($htmls)) { $htmls = $_htmls; } // 检测操作的静态规则 if (isset($htmls[MODULE_NAME . ':' . ACTION_NAME])) { // 定义了某个模块的操作的静态规则 $html = $htmls[MODULE_NAME . ':' . ACTION_NAME]; } elseif (isset($htmls[ACTION_NAME])) { // 所有操作的静态规则 $html = $htmls[ACTION_NAME]; } elseif (isset($htmls['*'])) { // 定义了全局的静态规则 $html = $htmls['*']; } if (!empty($html)) { self::$requireCache = true; // 解读静态规则 $rule = $html[0]; // 以$_开头的系统变量 $rule = preg_replace('/{\\$(_\\w+)\\.(\\w+)\\|(\\w+)}/e', "\\3(\$\\1['\\2'])", $rule); $rule = preg_replace('/{\\$(_\\w+)\\.(\\w+)}/e', "\$\\1['\\2']", $rule); // {ID|FUN} GET变量的简写 $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}'), array(APP_NAME, MODULE_NAME, ACTION_NAME), $rule); // {|FUN} 单独使用函数 $rule = preg_replace('/{|(\\w+)}/e', "\\1()", $rule); if (!empty($html[2])) { // 应用附加函数 $rule = $html[2]($rule); } $time = $html[1] ? $html[1] : C('HTML_CACHE_TIME'); // 缓存有效期 -1 为永久缓存 self::$cacheTime = $time; $cacheName = $rule . C('HTML_FILE_SUFFIX'); self::$cacheFile = $cacheName; define('HTML_FILE_NAME', C('HTML_PATH') . $cacheName); if (self::checkHTMLCache(HTML_FILE_NAME, $time)) { //静态页面有效 if (C('HTML_READ_TYPE') == 1) { // 重定向到静态页面 redirect(str_replace(realpath($_SERVER["DOCUMENT_ROOT"]), '', realpath(HTML_FILE_NAME))); } else { // 读取静态页面输出 readfile(HTML_FILE_NAME); exit; } } } } return; }