| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813 | 
							- <?php
 
- // +----------------------------------------------------------------------
 
- // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
 
- // +----------------------------------------------------------------------
 
- // | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
 
- // +----------------------------------------------------------------------
 
- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
 
- // +----------------------------------------------------------------------
 
- // | Author: liu21st <liu21st@gmail.com>
 
- // +----------------------------------------------------------------------
 
- /**
 
-  * Think 标准模式公共函数库
 
-  * @category   Think
 
-  * @package  Common
 
-  * @author   liu21st <liu21st@gmail.com>
 
-  */
 
- /**
 
-  * 错误输出
 
-  * @param mixed $error 错误
 
-  * @return void
 
-  */
 
- 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;
 
- }
 
- /**
 
-  * 自定义异常处理
 
-  * @param string $msg 异常消息
 
-  * @param string $type 异常类型 默认为ThinkException
 
-  * @param integer $code 异常代码 默认为0
 
-  * @return void
 
-  */
 
- function throw_exception($msg, $type='ThinkException', $code=0) {
 
-     if (class_exists($type, false))
 
-         throw new $type($msg, $code);
 
-     else
 
-         halt($msg);        // 异常类型不存在则输出错误信息字串
 
- }
 
- /**
 
-  * 浏览器友好的变量输出
 
-  * @param mixed $var 变量
 
-  * @param boolean $echo 是否输出 默认为True 如果为false 则返回输出字符串
 
-  * @param string $label 标签 默认为空
 
-  * @param boolean $strict 是否严谨 默认为true
 
-  * @return void|string
 
-  */
 
- 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;
 
- }
 
- /**
 
-  * 404处理
 
-  * 调试模式会抛异常
 
-  * 部署模式下面传入url参数可以指定跳转页面,否则发送404信息
 
-  * @param string $msg 提示信息
 
-  * @param string $url 跳转URL地址
 
-  * @return void
 
-  */
 
- 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;
 
-     }
 
- }
 
- /**
 
-  * 设置当前页面的布局
 
-  * @param string|false $layout 布局名称 为false的时候表示关闭布局
 
-  * @return void
 
-  */
 
- function layout($layout) {
 
-     if(false !== $layout) {
 
-         // 开启布局
 
-         C('LAYOUT_ON',true);
 
-         if(is_string($layout)) { // 设置新的布局模板
 
-             C('LAYOUT_NAME',$layout);
 
-         }
 
-     }else{// 临时关闭布局
 
-         C('LAYOUT_ON',false);
 
-     }
 
- }
 
- /**
 
-  * URL组装 支持不同URL模式
 
-  * @param string $url URL表达式,格式:'[分组/模块/操作#锚点@域名]?参数1=值1&参数2=值2...'
 
-  * @param string|array $vars 传入的参数,支持数组和字符串
 
-  * @param string $suffix 伪静态后缀,默认为true表示获取配置值
 
-  * @param boolean $redirect 是否跳转,如果设置为true则表示跳转到该URL地址
 
-  * @param boolean $domain 是否显示域名
 
-  * @return string
 
-  */
 
- function U($url='',$vars='',$suffix=true,$redirect=false,$domain=false) {
 
-     // 解析URL
 
-     $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'],'.');
 
-             // '子域名'=>array('项目[/分组]');
 
-             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)) { // aaa=1&bbb=2 转换成数组
 
-         parse_str($vars,$vars);
 
-     }elseif(!is_array($vars)){
 
-         $vars = array();
 
-     }
 
-     if(isset($info['query'])) { // 解析地址里面参数 合并到vars
 
-         parse_str($info['query'],$params);
 
-         $vars = array_merge($params,$vars);
 
-     }
 
-     // URL组装
 
-     $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转换
 
-         $url        =   __APP__.'?'.http_build_query(array_reverse($var));
 
-         if(!empty($vars)) {
 
-             $vars   =   urldecode(http_build_query($vars));
 
-             $url   .=   '&'.$vars;
 
-         }
 
-     }else{ // PATHINFO模式或者兼容URL模式
 
-         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) // 直接跳转URL
 
-         redirect($url);
 
-     else
 
-         return $url;
 
- }
 
- /**
 
-  * 渲染输出Widget
 
-  * @param string $name Widget名称
 
-  * @param array $data 传入的参数
 
-  * @param boolean $return 是否返回内容
 
-  * @param string $path Widget所在路径
 
-  * @return void
 
-  */
 
- 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;
 
- }
 
- /**
 
-  * 过滤器方法 引用传值
 
-  * @param string $name 过滤器名称
 
-  * @param string $content 要过滤的内容
 
-  * @return void
 
-  */
 
- function filter($name, &$content) {
 
-     $class      =   $name . 'Filter';
 
-     require_cache(BASE_LIB_PATH . 'Filter/' . $class . '.class.php');
 
-     $filter     =   new $class();
 
-     $content    =   $filter->run($content);
 
- }
 
- /**
 
-  * 判断是否SSL协议
 
-  * @return boolean
 
-  */
 
- 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;
 
- }
 
- /**
 
-  * URL重定向
 
-  * @param string $url 重定向的URL地址
 
-  * @param integer $time 重定向的等待时间(秒)
 
-  * @param string $msg 重定向前的提示信息
 
-  * @return void
 
-  */
 
- function redirect($url, $time=0, $msg='') {
 
-     //多行URL地址支持
 
-     $url        = str_replace(array("\n", "\r"), '', $url);
 
-     if (empty($msg))
 
-         $msg    = "系统将在{$time}秒之后自动跳转到{$url}!";
 
-     if (!headers_sent()) {
 
-         // redirect
 
-         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);
 
-     }
 
- }
 
- /**
 
-  * 缓存管理
 
-  * @param mixed $name 缓存名称,如果为数组表示进行缓存设置
 
-  * @param mixed $value 缓存值
 
-  * @param mixed $options 缓存参数
 
-  * @return mixed
 
-  */
 
- 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);
 
-     }
 
- }
 
- // S方法的别名 已经废除 不再建议使用
 
- function cache($name,$value='',$options=null){
 
-     return S($name,$value,$options);
 
- }
 
- /**
 
-  * 快速文件数据读取和保存 针对简单类型数据 字符串、数组
 
-  * @param string $name 缓存名称
 
-  * @param mixed $value 缓存值
 
-  * @param string $path 缓存路径
 
-  * @return mixed
 
-  */
 
- 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;
 
- }
 
- /**
 
-  * 取得对象实例 支持调用类的静态方法
 
-  * @param string $name 类名
 
-  * @param string $method 方法名,如果为空则返回实例化对象
 
-  * @param array $args 调用参数
 
-  * @return object
 
-  */
 
- 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];
 
- }
 
- /**
 
-  * 根据PHP各种类型变量生成唯一标识号
 
-  * @param mixed $mix 变量
 
-  * @return string
 
-  */
 
- 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);
 
- }
 
- /**
 
-  * XML编码
 
-  * @param mixed $data 数据
 
-  * @param string $root 根节点名
 
-  * @param string $item 数字索引的子节点名
 
-  * @param string $attr 根节点属性
 
-  * @param string $id   数字索引子节点key转换的属性名
 
-  * @param string $encoding 数据编码
 
-  * @return string
 
-  */
 
- 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;
 
- }
 
- /**
 
-  * 数据XML编码
 
-  * @param mixed  $data 数据
 
-  * @param string $item 数字索引时的节点名称
 
-  * @param string $id   数字索引key转换为的属性名
 
-  * @return string
 
-  */
 
- 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;
 
- }
 
- /**
 
-  * session管理函数
 
-  * @param string|array $name session名称 如果为数组则表示进行session设置
 
-  * @param mixed $value session值
 
-  * @return mixed
 
-  */
 
- function session($name,$value='') {
 
-     $prefix   =  C('SESSION_PREFIX');
 
-     if(is_array($name)) { // session初始化 在session_start 之前调用
 
-         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')) { // 读取session驱动
 
-             $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);
 
-             }
 
-         }
 
-         // 启动session
 
-         if(C('SESSION_AUTO_START'))  session_start();
 
-     }elseif('' === $value){
 
-         if(0===strpos($name,'[')) { // session 操作
 
-             if('[pause]'==$name){ // 暂停session
 
-                 session_write_close();
 
-             }elseif('[start]'==$name){ // 启动session
 
-                 session_start();
 
-             }elseif('[destroy]'==$name){ // 销毁session
 
-                 $_SESSION =  array();
 
-                 session_unset();
 
-                 session_destroy();
 
-             }elseif('[regenerate]'==$name){ // 重新生成id
 
-                 session_regenerate_id();
 
-             }
 
-         }elseif(0===strpos($name,'?')){ // 检查session
 
-             $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)){ // 清空session
 
-             if($prefix) {
 
-                 unset($_SESSION[$prefix]);
 
-             }else{
 
-                 $_SESSION = array();
 
-             }
 
-         }elseif($prefix){ // 获取session
 
-             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)){ // 删除session
 
-         if($prefix){
 
-             unset($_SESSION[$prefix][$name]);
 
-         }else{
 
-             unset($_SESSION[$name]);
 
-         }
 
-     }else{ // 设置session
 
-         if($prefix){
 
-             if (!is_array($_SESSION[$prefix])) {
 
-                 $_SESSION[$prefix] = array();
 
-             }
 
-             $_SESSION[$prefix][$name]   =  $value;
 
-         }else{
 
-             $_SESSION[$name]  =  $value;
 
-         }
 
-     }
 
- }
 
- /**
 
-  * Cookie 设置、获取、删除
 
-  * @param string $name cookie名称
 
-  * @param mixed $value cookie值
 
-  * @param mixed $options cookie参数
 
-  * @return mixed
 
-  */
 
- function cookie($name, $value='', $option=null) {
 
-     // 默认设置
 
-     $config = array(
 
-         'prefix'    =>  C('COOKIE_PREFIX'), // cookie 名称前缀
 
-         'expire'    =>  C('COOKIE_EXPIRE'), // cookie 保存时间
 
-         'path'      =>  C('COOKIE_PATH'), // cookie 保存路径
 
-         'domain'    =>  C('COOKIE_DOMAIN'), // cookie 有效域名
 
-     );
 
-     // 参数设置(会覆盖黙认设置)
 
-     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));
 
-     }
 
-     // 清除指定前缀的所有cookie
 
-     if (is_null($name)) {
 
-         if (empty($_COOKIE))
 
-             return;
 
-         // 要删除的cookie前缀,不指定则删除config设置的指定前缀
 
-         $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]); // 删除指定cookie
 
-         } else {
 
-             // 设置cookie
 
-             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;
 
-         }
 
-     }
 
- }
 
- /**
 
-  * 加载动态扩展文件
 
-  * @return void
 
-  */
 
- 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);
 
-             }
 
-         }
 
-     }
 
- }
 
- /**
 
-  * 获取客户端IP地址
 
-  * @param integer $type 返回类型 0 返回IP地址 1 返回IPV4地址数字
 
-  * @return mixed
 
-  */
 
- 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'];
 
-     }
 
-     // IP地址合法验证
 
-     $long = sprintf("%u",ip2long($ip));
 
-     $ip   = $long ? array($ip, $long) : array('0.0.0.0', 0);
 
-     return $ip[$type];
 
- }
 
- /**
 
-  * 发送HTTP状态
 
-  * @param integer $code 状态码
 
-  * @return void
 
-  */
 
- function send_http_status($code) {
 
-     static $_status = array(
 
-         // Informational 1xx
 
-         100 => 'Continue',
 
-         101 => 'Switching Protocols',
 
-         // Success 2xx
 
-         200 => 'OK',
 
-         201 => 'Created',
 
-         202 => 'Accepted',
 
-         203 => 'Non-Authoritative Information',
 
-         204 => 'No Content',
 
-         205 => 'Reset Content',
 
-         206 => 'Partial Content',
 
-         // Redirection 3xx
 
-         300 => 'Multiple Choices',
 
-         301 => 'Moved Permanently',
 
-         302 => 'Moved Temporarily ', // 1.1
 
-         303 => 'See Other',
 
-         304 => 'Not Modified',
 
-         305 => 'Use Proxy',
 
-         // 306 is deprecated but reserved
 
-         307 => 'Temporary Redirect',
 
-         // Client Error 4xx
 
-         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',
 
-         // Server Error 5xx
 
-         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]);
 
-         // 确保FastCGI模式下正常
 
-         header('Status:'.$code.' '.$_status[$code]);
 
-     }
 
- }
 
- // 过滤表单中的表达式
 
- function filter_exp(&$value){
 
-     if (in_array(strtolower($value),array('exp','or'))){
 
-         $value .= ' ';
 
-     }
 
- }
 
 
  |