首页
站长论坛BBS
救助
投稿
discuz视频教程
discuz技术支持
版块
登录
快速注册

class_core.php文件中核心基础类库中discuz_core类分析

ARCHY 2015-6-14 [Discuz开发] 来自PC 复制链接
14364
discuz使用视频教程
31idc

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
discuz X3 /source/class/class_core.php文件中数据库操作类DB及db_mysql分析

  1. <?php
  2. define('IN_DISCUZ', true);//禁止用户直接通过路径访问
  3. error_reporting(0);//设置错误级别

  4. //通用基础类
  5. class discuz_core {

  6.         var $db = null;//数据库db类实例化对象

  7.         var $mem = null;//memcached缓存对象

  8.         var $session = null;//session变量

  9.         var $config = array();//配置信息
  10.         
  11.         //$_G数组的映射
  12.         var $var = array();//变量数组,将超级全局变量$_G的引用赋值给了$var变量

  13.         //加载缓存数组
  14.         var $cachelist = array();//缓存列表

  15.         //是否初始化
  16.         var $init_setting = true;//初始化设置
  17.         var $init_user = true;//初始化用户信息
  18.         var $init_session = true;//初始化session信息
  19.         var $init_cron = true;
  20.         var $init_misc = true;
  21.         var $init_memory = true;//初始化内存情况
  22.         var $init_mobile = true;

  23.         //是否已经初始化
  24.         var $initated = false;//初始化工作为完成标志

  25.         //列举全局变量,为清理做准备
  26.         var $superglobal = array(//自定义超级全局变量
  27.                 'GLOBALS' => 1,
  28.                 '_GET' => 1,
  29.                 '_POST' => 1,
  30.                 '_REQUEST' => 1,
  31.                 '_COOKIE' => 1,
  32.                 '_SERVER' => 1,
  33.                 '_ENV' => 1,
  34.                 '_FILES' => 1,
  35.         );

  36.         //建立唯一的进程
  37.         function &instance() {//单例模式实例化一个discuz_core核心类实例化对象
  38.                 static $object;
  39.                 if(empty($object)) {
  40.                         $object = new discuz_core();//实例化一个discuz_core对象
  41.                 }
  42.                 return $object;//返回唯一的一个discuz_core类实例化对象
  43.         }

  44.         //预处理的调用
  45.         function discuz_core() {//构造函数
  46.                 $this->_init_env();//初始化环境变量
  47.                 $this->_init_config();//初始化配置变量
  48.                 $this->_init_input();//初始化输入
  49.                 $this->_init_output();//初始化输出
  50.         }

  51.         //核心的初始化
  52.         function init() {
  53.                 if(!$this->initated) {
  54.                         $this->_init_db();//数据库操作类实例化对象的初始化
  55.                         $this->_init_memory();//初始化memcache
  56.                         $this->_init_user();//用户信息初始化
  57.                         $this->_init_session();//session操作初始化
  58.                         $this->_init_setting();//系统设置初始化
  59.                         $this->_init_mobile();//手机功能初始化
  60.                         $this->_init_cron();//计划任务初始化
  61.                         $this->_init_misc();//其他功能的初始化
  62.                 }
  63.                 $this->initated = true;//初始化完成的标志
  64.         }

  65.         //定义php环境信息常量和$_G全局变量
  66.         /*
  67.          * 1、主要讲$_G变量的引用赋值给$var数组变量
  68.          * 2、注意:G变量是程序的全局变量,为了让程序更加高效,减少不必要的数据获取,所以程序特将经常需要用到的变量统一到
  69.          *    G变量下,如:用户登录信息、后台设置信息、服务器环境信息、客户端cookies、数据缓存等都存放在G变量里面,在制作
  70.          *    模板文件的时只需将G变量打印出来即可获得需要的信息是否在G变量中
  71.          * 3、自定义变量:自定义变量是以$开头并且首位为字母或下划线的变量,
  72.          *    如:$data、$thread、$post、$forumlist、$threadlist
  73.          * 4、类似$_G['gp_xxx']变量都是get和post过来的数据
  74.          */
  75.         function _init_env() {
  76.                 //设置错误级别
  77.                 error_reporting(E_ERROR);
  78.                 if(PHP_VERSION < '5.3.0') {
  79.                         set_magic_quotes_runtime(0);//设置set_magic_quotes_runtime
  80.                 }

  81.                 define('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -12));//定义根目录常量:"d:/wamp/www/discuz/"
  82.                 define('MAGIC_QUOTES_GPC', function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc());//定义MAGIC_QUOTES_GPC常量
  83.                 define('ICONV_ENABLE', function_exists('iconv'));//定义是否支持转码函数常量,如:iconv("gb2312","utf-8","我爱卡");//将gb2312编码转换为utf-8编码
  84.                 define('MB_ENABLE', function_exists('mb_convert_encoding'));//定义是否支持转码函数常量,跟iconv用法差不多,有稍微差异
  85.                 define('EXT_OBGZIP', function_exists('ob_gzhandler'));//缓存输出句柄函数

  86.                 define('TIMESTAMP', time());//定义当前时间戳常量
  87.                 $this->timezone_set();//设置时区
  88.                
  89.                 /*
  90.                  * 1、加载系统核心函数库文件
  91.                  * 2、条件:常量未定义、系统函数库未加载的情况下报"系统核心函数库文件丢失"的错误,否则加载系统核心函数库文件
  92.                  */
  93.                 if(!defined('DISCUZ_CORE_FUNCTION') && !@include(DISCUZ_ROOT.'./source/function/function_core.php')) {
  94.                         exit('function_core.php is missing');//退出,并报"系统核心函数库文件丢失的错误"
  95.                 }

  96.                 if(function_exists('ini_get')) {//获取php.ini配置文件中设置的配置信息
  97.                         $memorylimit = @ini_get('memory_limit');//设置内存使用限制
  98.                         if($memorylimit && return_bytes($memorylimit) < 33554432 && function_exists('ini_set')) {
  99.                                 ini_set('memory_limit', '128m');//如果小于32M,则增加到128M
  100.                         }
  101.                 }

  102.                 define('IS_ROBOT', checkrobot());//检测机器人

  103.                 //$GLOBALS:超全局变量,全局作用域中始终可用的内置变量,在函数和方法中无需使用 global $xxx声明
  104.                 foreach ($GLOBALS as $key => $value) {
  105.                         if (!isset($this->superglobal[$key])) {//注销没有在$superglobal中出现的超全局变量,也就是注销所有的超级全局变量
  106.                                 $GLOBALS[$key] = null; unset($GLOBALS[$key]);//设置为null并销毁
  107.                         }
  108.                 }

  109.                 //超级变量大数组$_G的定义,在模板文件中要使用
  110.                 global $_G;//函数体外可以使用,注意:只能在本文件中,或者include的文件中使用,并不能再整个网站中使用
  111.                 $_G = array(
  112.                         'uid' => 0,//作者UID
  113.                         'username' => '',//用户名
  114.                         'adminid' => 0,//管理组ID
  115.                         'groupid' => 1,//用户组ID
  116.                         'sid' => '',//cookie和session相关的sid
  117.                         'formhash' => '',//表单验证认证
  118.                         'timestamp' => TIMESTAMP,//时间戳
  119.                         'starttime' => dmicrotime(),//开始时间
  120.                         'clientip' => $this->_get_client_ip(),//客户端ip
  121.                         'referer' => '',//来路
  122.                         'charset' => '',//字符编码设置
  123.                         'gzipcompress' => '',//gzip
  124.                         'authkey' => '',//密钥
  125.                         'timenow' => array(),

  126.                         'PHP_SELF' => '',//当前php脚本文件,如:"/discuz/forum.php"
  127.                         'siteurl' => '',//站点url
  128.                         'siteroot' => '',//站点根目录
  129.                         'siteport' => '',//站点端口

  130.                         'config' => array(),//配置变量数组
  131.                         'setting' => array(),//设置变量数组
  132.                         'member' => array(),//用户信息数组
  133.                         'group' => array(),//用户组数组
  134.                         'cookie' => array(),//cookie数组
  135.                         'style' => array(),//风格数组
  136.                         'cache' => array(),//缓存列表数组
  137.                         'session' => array(),//session变量数组
  138.                         'lang' => array(),//语言包数组
  139.                         'my_app' => array(),//我的应用数组
  140.                         'my_userapp' => array(),//用户应用数组

  141.                         'fid' => 0,//版块id
  142.                         'tid' => 0,//帖子id
  143.                         'forum' => array(),//论坛版块数组
  144.                         'thread' => array(),//论坛相关帖子数组
  145.                         'rssauth' => '',//RSS订阅认证

  146.                         'home' => array(),//home功能相关数组
  147.                         'space' => array(),//space功能相关数组

  148.                         'block' => array(),//块信息数组
  149.                         'article' => array(),//文章相关

  150.                         'action' => array(
  151.                                 'action' => APPTYPEID,
  152.                                 'fid' => 0,//版块id
  153.                                 'tid' => 0,//帖子id
  154.                         ),

  155.                         'mobile' => '',//手机信息

  156.                 );
  157.                 $_G['PHP_SELF'] = htmlspecialchars($this->_get_script_url());//将当前脚本地址写入$_G超级变量中;结果:"/discuz/forum.php"
  158.                 $_G['basescript'] = CURSCRIPT;//当前不带扩展名的php脚本,如:"forum"
  159.                 $_G['basefilename'] = basename($_G['PHP_SELF']);//显示带有文件扩展名的php文件名称,如:"forum.php"
  160.                 $sitepath = substr($_G['PHP_SELF'], 0, strrpos($_G['PHP_SELF'], '/'));//如:"/discuz"
  161.                 if(defined('IN_API')) {
  162.                         $sitepath = preg_replace("/\/api\/?.*?$/i", '', $sitepath);
  163.                 } elseif(defined('IN_ARCHIVER')) {
  164.                         $sitepath = preg_replace("/\/archiver/i", '', $sitepath);
  165.                 }
  166.                 $_G['siteurl'] = htmlspecialchars('http://'.$_SERVER['HTTP_HOST'].$sitepath.'/');//网站地址

  167.                 $url = parse_url($_G['siteurl']);
  168.                 $_G['siteroot'] = isset($url['path']) ? $url['path'] : '';//网站根目录,如:"/discuz"
  169.                 $_G['siteport'] = empty($_SERVER['SERVER_PORT']) || $_SERVER['SERVER_PORT'] == '80' ? '' : ':'.$_SERVER['SERVER_PORT'];//端口

  170.                 if(defined('SUB_DIR')) {//二级目录设置情况
  171.                         $_G['siteurl'] = str_replace(SUB_DIR, '/', $_G['siteurl']);
  172.                         $_G['siteroot'] = str_replace(SUB_DIR, '/', $_G['siteroot']);
  173.                 }

  174.                 $this->var = & $_G;//$_G变量的引用赋值给$var,以后对$_G变量或$var变量的修改会直接影响到对方

  175.         }

  176.         /*
  177.          * 1、返回PHP_SELF当前脚本文件
  178.          */
  179.         function _get_script_url() {
  180.                 if($this->var['PHP_SELF'] === null){
  181.                         $scriptName = basename($_SERVER['SCRIPT_FILENAME']);
  182.                         if(basename($_SERVER['SCRIPT_NAME']) === $scriptName) {
  183.                                 $this->var['PHP_SELF'] = $_SERVER['SCRIPT_NAME'];
  184.                         } else if(basename($_SERVER['PHP_SELF']) === $scriptName) {
  185.                                 $this->var['PHP_SELF'] = $_SERVER['PHP_SELF'];
  186.                         } else if(isset($_SERVER['ORIG_SCRIPT_NAME']) && basename($_SERVER['ORIG_SCRIPT_NAME']) === $scriptName) {
  187.                                 $this->var['PHP_SELF'] = $_SERVER['ORIG_SCRIPT_NAME'];
  188.                         } else if(($pos = strpos($_SERVER['PHP_SELF'],'/'.$scriptName)) !== false) {
  189.                                 $this->var['PHP_SELF'] = substr($_SERVER['SCRIPT_NAME'],0,$pos).'/'.$scriptName;
  190.                         } else if(isset($_SERVER['DOCUMENT_ROOT']) && strpos($_SERVER['SCRIPT_FILENAME'],$_SERVER['DOCUMENT_ROOT']) === 0) {
  191.                                 $this->var['PHP_SELF'] = str_replace('\\','/',str_replace($_SERVER['DOCUMENT_ROOT'],'',$_SERVER['SCRIPT_FILENAME']));
  192.                         } else {
  193.                                 system_error('request_tainting');
  194.                         }
  195.                 }
  196.                 return $this->var['PHP_SELF'];
  197.         }

  198.         /*
  199.          * 1、合并$_POST和$_GET,然后将$_POST和$_GET的值都赋予gp变量中,方便使用
  200.          * 2、禁止对全局变量注入
  201.          * 3、slashes处理
  202.          * 4、cookie处理:去掉cookie前缀
  203.          */
  204.         function _init_input() {
  205.                 if (isset($_GET['GLOBALS']) ||isset($_POST['GLOBALS']) ||  isset($_COOKIE['GLOBALS']) || isset($_FILES['GLOBALS'])) {
  206.                         system_error('request_tainting');//...请求中...
  207.                 }

  208.                 if(!MAGIC_QUOTES_GPC) {//魔术函数是否开启:仅仅对$_GET、$_POST、$_COOKIE起作用;主要用于在讲数据入库前做一些安全性的转义
  209.                         $_GET = daddslashes($_GET);//对$_GET数据进行转义
  210.                         $_POST = daddslashes($_POST);//对$_POST数据进行转义
  211.                         $_COOKIE = daddslashes($_COOKIE);//对$_COOKIE数据进行转义
  212.                         $_FILES = daddslashes($_FILES);//对$_FILES数据进行转义
  213.                 }

  214.                 /*
  215.                  * 1、如果cookie的键值等于定义的键值,那么截取cookie的前缀cookiepre
  216.                  */
  217.                 $prelength = strlen($this->config['cookie']['cookiepre']);
  218.                 foreach($_COOKIE as $key => $val) {
  219.                         if(substr($key, 0, $prelength) == $this->config['cookie']['cookiepre']) {
  220.                                 $this->var['cookie'][substr($key, $prelength)] = $val;//cookie赋值
  221.                         }
  222.                 }

  223.                 /*
  224.                  * 1、合并$_POST和$_GET,然后将$_POST和$_GET的值都赋予gp变量中,方便使用
  225.                  */
  226.                 if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST)) {
  227.                         $_GET = array_merge($_GET, $_POST);
  228.                 }
  229.                
  230.                 //diy
  231.                 if(isset($_GET['diy'])) {
  232.                         $_GET['diy'] = empty($_GET['diy']) ? '' : $_GET['diy'];
  233.                 }

  234.                 foreach($_GET as $k => $v) {
  235.                         $this->var['gp_'.$k] = $v;//将$_POST和$_GET的值都赋予gp变量中,方便使用
  236.                 }

  237.                 //获取$mod变量,如:/?mod=xxx ,那么$this->var['mod']=xxx;
  238.                 $this->var['mod'] = empty($this->var['gp_mod']) ? '' : htmlspecialchars($this->var['gp_mod']);
  239.                 //是否需要ajax方式
  240.                 $this->var['inajax'] = empty($this->var['gp_inajax']) ? 0 : (empty($this->var['config']['output']['ajaxvalidate']) ? 1 : ($_SERVER['REQUEST_METHOD'] == 'GET' && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' || $_SERVER['REQUEST_METHOD'] == 'POST' ? 1 : 0));
  241.                 //页面获取,最小为1
  242.                 $this->var['page'] = empty($this->var['gp_page']) ? 1 : max(1, intval($this->var['gp_page']));
  243.                 //cookie与session相关的sid的获取
  244.                 $this->var['sid'] = $this->var['cookie']['sid'] = isset($this->var['cookie']['sid']) ? htmlspecialchars($this->var['cookie']['sid']) : '';
  245.                 $this->var['gp_handlekey'] = !empty($this->var['gp_handlekey']) && preg_match('/^\w+$/', $this->var['gp_handlekey']) ? $this->var['gp_handlekey'] : '';

  246.                 if(empty($this->var['cookie']['saltkey'])) {//解密时可能会使用到
  247.                         $this->var['cookie']['saltkey'] = random(8);
  248.                         dsetcookie('saltkey', $this->var['cookie']['saltkey'], 86400 * 30, 1, 1);
  249.                 }
  250.                 //密钥
  251.                 $this->var['authkey'] = md5($this->var['config']['security']['authkey'].$this->var['cookie']['saltkey']);
  252.         }

  253.         /*
  254.          * 1、主要讲$config引用赋值给$config=array()和 $var['config']=$config;
  255.          * 2、加载配置文件
  256.          */
  257.         function _init_config() {

  258.                 $_config = array();//定义$_config配置数组
  259.                 @include DISCUZ_ROOT.'./config/config_global.php';//加载全局配置文件,配置文件中是一个$_config数组
  260.                 if(empty($_config)) {//配置信息为空的情况,安装前为空
  261.                         if(!file_exists(DISCUZ_ROOT.'./data/install.lock')) {//没有安装的情况
  262.                                 header('location: install');//安装discuz论坛系统
  263.                                 exit;
  264.                         } else {
  265.                                 system_error('config_notfound');
  266.                         }
  267.                 }

  268.                 //设置安全认证的authkey
  269.                 if(empty($_config['security']['authkey'])) {
  270.                         $_config['security']['authkey'] = md5($_config['cookie']['cookiepre'].$_config['db'][1]['dbname']);//密钥的组成:cookie前缀+数据库的名称
  271.                 }

  272.                 //是否调试模式
  273.                 if(empty($_config['debug']) || !file_exists(libfile('function/debug'))) {
  274.                         define('DISCUZ_DEBUG', false);//调试模式关闭
  275.                 } elseif($_config['debug'] === 1 || $_config['debug'] === 2 || !empty($_REQUEST['debug']) && $_REQUEST['debug'] === $_config['debug']) {
  276.                         define('DISCUZ_DEBUG', true);//调试模式打开
  277.                         if($_config['debug'] == 2) {
  278.                                 error_reporting(E_ALL);//设置错误级别
  279.                         }
  280.                 } else {
  281.                         define('DISCUZ_DEBUG', false);
  282.                 }

  283.                 //定义静态文件常量:方便找到images、css、js素材文件
  284.                 define('STATICURL', !empty($_config['output']['staticurl']) ? $_config['output']['staticurl'] : 'static/');
  285.                 $this->var['staticurl'] = STATICURL;//素材文件url:主要用于存储images、css、js等素材文件

  286.                 $this->config = & $_config;//配置信息的引用赋值给$config数组变量
  287.                 $this->var['config'] = & $_config;//同时配置信息的引用赋值给$var['config'],即:赋值给了$_G['config']

  288.                 //设置cookie域,一般是设置目录域,"/"不存在则加上"/"
  289.                 if(substr($_config['cookie']['cookiepath'], 0, 1) != '/') {//cookie路径
  290.                         $this->var['config']['cookie']['cookiepath'] = '/'.$this->var['config']['cookie']['cookiepath'];
  291.                 }
  292.                 //定义cookie前缀,如:定义为xxx_,则为$cookie[xxx_uid]
  293.                 $this->var['config']['cookie']['cookiepre'] = $this->var['config']['cookie']['cookiepre'].substr(md5($this->var['config']['cookie']['cookiepath'].'|'.$this->var['config']['cookie']['cookiedomain']), 0, 4).'_';

  294.         }

  295.         /*
  296.          * 1、输出处理
  297.          * 2、get参数跨站检测
  298.          * 3、防页面刷新
  299.          * 4、gzip处理
  300.          * 5、字符集处理
  301.          */
  302.         function _init_output() {

  303.                 if($this->config['security']['urlxssdefend'] && $_SERVER['REQUEST_METHOD'] == 'GET' && !empty($_SERVER['REQUEST_URI'])) {
  304.                         $this->_xss_check();
  305.                 }

  306.                 /*
  307.                  * 1、验证码的设置:加载include/misc/security.php文件,验证功能
  308.                  */
  309.                 if($this->config['security']['attackevasive'] && (!defined('CURSCRIPT') || !in_array($this->var['mod'], array('seccode', 'secqaa', 'swfupload')))) {
  310.                         require_once libfile('misc/security', 'include');
  311.                 }

  312.                 /*
  313.                  * 1、是否开启gzip,如果不支持gzip,则定义为false
  314.                  */
  315.                 if(!empty($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') === false) {
  316.                         $this->config['output']['gzip'] = false;
  317.                 }

  318.                 //将$allowgzip写入全局变量中
  319.                 $allowgzip = $this->config['output']['gzip'] && empty($this->var['inajax']) && $this->var['mod'] != 'attachment' && EXT_OBGZIP;
  320.                 setglobal('gzipcompress', $allowgzip);
  321.                 ob_start($allowgzip ? 'ob_gzhandler' : null);//定义输出缓存

  322.                 //将配置文件中的字符集写入全局变量中
  323.                 setglobal('charset', $this->config['output']['charset']);
  324.                 define('CHARSET', $this->config['output']['charset']);
  325.                 if($this->config['output']['forceheader']) {
  326.                         @header('Content-Type: text/html; charset='.CHARSET);//设置网页编码,强制输出
  327.                 }

  328.         }

  329.         /*
  330.          * 1、拒绝机器人访问,设置为403错误
  331.          */
  332.         function reject_robot() {
  333.                 if(IS_ROBOT) {
  334.                         exit(header("HTTP/1.1 403 Forbidden"));
  335.                 }
  336.         }

  337.         /*
  338.          * 1、检查xss漏洞、ubb漏洞
  339.          * 2、get参数跨站检测
  340.          */
  341.         function _xss_check() {
  342.                 $temp = strtoupper(urldecode(urldecode($_SERVER['REQUEST_URI'])));
  343.                 if(strpos($temp, '<') !== false || strpos($temp, '"') !== false || strpos($temp, 'CONTENT-TRANSFER-ENCODING') !== false) {
  344.                         system_error('request_tainting');
  345.                 }
  346.                 return true;
  347.         }

  348.         /*
  349.          * 1、获取客户端的ip
  350.          */
  351.         function _get_client_ip() {
  352.                 $ip = $_SERVER['REMOTE_ADDR'];
  353.                 if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
  354.                         $ip = $_SERVER['HTTP_CLIENT_IP'];
  355.                 } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
  356.                         foreach ($matches[0] AS $xip) {
  357.                                 if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
  358.                                         $ip = $xip;
  359.                                         break;
  360.                                 }
  361.                         }
  362.                 }
  363.                 return $ip;
  364.         }

  365.         /*
  366.          * 1、初始化数据库类、同时选择主从数据库
  367.          */
  368.         function _init_db() {
  369.                 $class = 'db_mysql';
  370.                 if(count(getglobal('config/db/slave'))) {//是否存在从数据连接,存在则初始化
  371.                         require_once libfile('class/mysql_slave');
  372.                         $class = 'db_mysql_slave';
  373.                 }
  374.                 $this->db = & DB::object($class);
  375.                 $this->db->set_config($this->config['db']);
  376.                 $this->db->connect();//建立数据库连接
  377.         }

  378.         /*
  379.          * 1、初始化session信息
  380.          */
  381.         function _init_session() {
  382.                 $this->session = new discuz_session();

  383.                 if($this->init_session)        {
  384.                         $this->session->init($this->var['cookie']['sid'], $this->var['clientip'], $this->var['uid']);
  385.                         $this->var['sid'] = $this->session->sid;//设置sid
  386.                         $this->var['session'] = $this->session->var;//设置session

  387.                         if($this->var['sid'] != $this->var['cookie']['sid']) {
  388.                                 dsetcookie('sid', $this->var['sid'], 86400);//如果sid不为cookie中的sid,则重写sid到cookie
  389.                         }

  390.                         if($this->session->isnew) {
  391.                                 if(ipbanned($this->var['clientip'])) {//如果发现ip在禁止范围内,则设置该客户端用户组为6,即:禁止ip用户组
  392.                                         $this->session->set('groupid', 6);
  393.                                 }
  394.                         }

  395.                         if($this->session->get('groupid') == 6) {
  396.                                 $this->var['member']['groupid'] = 6;
  397.                                 sysmessage('user_banned');//提示ip禁止
  398.                         }

  399.                         /*
  400.                          * 1、最近活动检测,600秒
  401.                          */
  402.                         if($this->var['uid'] && ($this->session->isnew || ($this->session->get('lastactivity') + 600) < TIMESTAMP)) {
  403.                                 $this->session->set('lastactivity', TIMESTAMP);
  404.                                 if($this->session->isnew) {
  405.                                         //如果用户在600秒内不活动,则设置最后访问时间点
  406.                                         DB::update('common_member_status', array('lastip' => $this->var['clientip'], 'lastvisit' => TIMESTAMP), "uid='".$this->var['uid']."'");
  407.                                 }
  408.                         }

  409.                 }
  410.         }

  411.         /*
  412.          * 1、初始化当前用户信息
  413.          */
  414.         function _init_user() {
  415.                 if($this->init_user) {
  416.                         $discuz_uid = '';
  417.                         /*通过COOKIE取得用户信息 start*/
  418.                         /*TODO utf-8 2 GBK change start*/
  419.                         /*$_cookie_userName = $_COOKIE["USERNAME"];*/
  420.                         $username_tmp = $_COOKIE["USERNAME"];
  421.                         $a=urldecode($username_tmp);
  422.                         /*$a=mb_convert_encoding($a, 'GB2312', 'UTF-8'); */
  423.                         $a=diconv($a, 'UTF-8', 'GBK');
  424.                         $_cookie_userName = $a;
  425.                         /*TODO utf-8 2 GBK change start*/
  426.                         $_cookie_userPassWord = $_COOKIE["USERAUTHCODE"];
  427.                         /*通过COOKIE取得用户信息 end*/
  428.                         if(!empty($_cookie_userName) && !empty($_cookie_userPassWord)) {
  429.                                 /* 判断用户是不是在UCENTER中存在,如果不存在则插入一条数据同步到DIS论坛用户 START */
  430.                                 /* 用COOKIE用户名称检索UCENTER */
  431.                                 $query = DB::query("SELECT uid FROM ".DB::table('ucenter_members')." WHERE username = '$_cookie_userName' limit 1");
  432.                                 if(!DB::num_rows($query)) {
  433.                                                 // 插入用户中心数据
  434.                                                 DB::query( "INSERT INTO ".DB::table('ucenter_members')." (uid,username,password,email) VALUES ('$discuz_uid','$_cookie_userName','$_cookie_userPassWord','')");
  435.                                                 DB::query("commit;");
  436.                                                 $query = DB::query("SELECT uid FROM ".DB::table('ucenter_members')." WHERE username = '$_cookie_userName' limit 1");
  437.                                                 $discuz_uid = DB::result($query, 0);
  438.                                                 DB::query( "INSERT INTO ".DB::table('ucenter_memberfields')."(uid) VALUES ('$discuz_uid')");
  439.                                                 DB::query("commit;");
  440.                                                 /* 这个取得公用主键ID  创建UCENTER中用户,在DIS中再检索处理 */
  441.                                                 /* 取得论坛用户UID */
  442.                                                 $query = DB::query("SELECT uid FROM ".DB::table("common_member")." WHERE username = '$_cookie_userName' limit 1");
  443.                                                 if(DB::num_rows($query)) {
  444.                                                         $discuz_uid = DB::result($query, 0);
  445.                                                 } else {
  446.                                                         // 同步插入论坛数据
  447.                                                         DB::query( "INSERT INTO ".DB::table('common_member')." (uid,username,password,adminid,groupid,regdate,email) VALUES ('$discuz_uid','$_cookie_userName','$_cookie_userPassWord','0','10','1307062876','')");
  448.                                                         DB::query( "INSERT INTO ".DB::table('common_member_status')." (uid) VALUES ('$discuz_uid')");
  449.                                                         DB::query( "INSERT INTO ".DB::table('common_member_profile')."(uid)value('$discuz_uid')");
  450.                                                         DB::query( "INSERT INTO ".DB::table('common_member_field_forum')."(uid)value('$discuz_uid')");
  451.                                                         DB::query( "INSERT INTO ".DB::table('common_member_field_home')."(uid)VALUE('$discuz_uid')");
  452.                                                         DB::query( "INSERT INTO ".DB::table('common_member_count')."(uid,extcredits1,extcredits2,extcredits3,extcredits4,extcredits5,extcredits6,extcredits7,extcredits8)VALUE('$discuz_uid','0','0','0','0','0','0','0','0')");
  453.                                                         DB::query("commit;");
  454.                                                         $query = DB::query("SELECT uid FROM ".DB::table("common_member")." WHERE username = '$_cookie_userName' limit 1");
  455.                                                         $discuz_uid = DB::result($query, 0);
  456.                                                 }
  457.                                                 // 取得登录用户信息,写入COOKIE
  458.                                                 $user = getuserbyuid($discuz_uid);
  459.                                                 $ucsynlogin = $this->setting['allowsynlogin'] ? uc_user_synlogin($discuz_uid) : '';
  460.                                                 $this->var['member'] = $user;
  461.                           } else {
  462.                                           // 取得登录用户信息,写入COOKIE
  463.                                                 $discuz_uid = DB::result($query, 0);
  464.                                                 DB::query(" UPDATE ".DB::table('ucenter_members')." SET password='".$_cookie_userPassWord."' WHERE uid=".$discuz_uid);
  465.                                                 DB::query(" UPDATE ".DB::table('common_member')." SET password='".$_cookie_userPassWord."' WHERE uid=".$discuz_uid);
  466.                                                 DB::query("commit;");
  467.                                                 $user = getuserbyuid($discuz_uid);
  468.                                                 //var_dump($discuz_uid);
  469.                                                 $ucsynlogin = $this->setting['allowsynlogin'] ? uc_user_synlogin($discuz_uid) : '';
  470.                                                 //var_dump($ucsynlogin);
  471.                                     $this->var['member'] = $user;
  472.                           }
  473. /*判断用户是不是在UCENTER中存在,如果不存在则插入一条数据同步到DIS论坛用户 END */
  474.                         } else {
  475.                                 /*判断是否UC用户 来源CDB start*/
  476.                                 if($auth = getglobal('auth', 'cookie')) {//得到auth,auth的值:"username\tuid"的加密信息
  477.                                         //进行解密
  478.                                         $auth = daddslashes(explode("\t", authcode($auth, 'DECODE')));
  479.                                 }
  480.                                 //得到用户名和用户密码,如果auth为空,或者确实uid和username中的一个,则为空
  481.                                 list($discuz_pw, $discuz_uid) = empty($auth) || count($auth) < 2 ? array('', '') : $auth;
  482.                                
  483.                                 if($discuz_uid) {
  484.                                         $user = getuserbyuid($discuz_uid);//如果uid存在,则得到该用户信息
  485.                                 }
  486.                                
  487.                                 if(!empty($user) && $user['password'] == $discuz_pw) {
  488.                                         $this->var['member'] = $user;//如果用户存在且密码正确,则将用户信息写入全局变量中
  489.                                 } else {
  490.                                         /*游客判断 START*/
  491.                                                 $user = array();//user定义为空数组
  492.                                                 $this->_init_guest();//是否为游客,游客初始化方法
  493.                                         /*游客判断 END*/
  494.                                 }
  495.                           /*判断是否UC用户 来源CDB end*/
  496.                         }
  497.                     
  498.                         //用户组过期检测
  499.                         if($user && $user['groupexpiry'] > 0 && $user['groupexpiry'] < TIMESTAMP && getgpc('mod') != 'spacecp' && getgpc('do') != 'expiry' && CURSCRIPT != 'home') {
  500.                                 dheader('location: home.php?mod=spacecp&ac=usergroup&do=expiry');
  501.                         }

  502.                         //用户组数据缓存
  503.                         $this->cachelist[] = 'usergroup_'.$this->var['member']['groupid'];
  504.                         if($user && $user['adminid'] > 0 && $user['groupid'] != $user['adminid']) {
  505.                                 $this->cachelist[] = 'admingroup_'.$this->var['member']['adminid'];
  506.                         }

  507.                 } else {
  508.                         $this->_init_guest();//游客
  509.                 }

  510.                 if(empty($this->var['cookie']['lastvisit'])) {//cookie中如果记录有最后一次访问时间,则写入
  511.                         $this->var['member']['lastvisit'] = TIMESTAMP - 3600;
  512.                         dsetcookie('lastvisit', TIMESTAMP - 3600, 86400 * 30);
  513.                 } else {
  514.                         //否则写入全局变量
  515.                         $this->var['member']['lastvisit'] = $this->var['cookie']['lastvisit'];
  516.                 }
  517.                 setglobal('uid', getglobal('uid', 'member'));//用户uid
  518.                 setglobal('username', addslashes(getglobal('username', 'member')));//用户名
  519.                 setglobal('adminid', getglobal('adminid', 'member'));//管理组id
  520.                 setglobal('groupid', getglobal('groupid', 'member'));//用户组id
  521.         }

  522.         /*
  523.          * 1、初始化当前用户信息为游客
  524.          */
  525.         function _init_guest() {
  526.                 setglobal('member', array( 'uid' => 0, 'username' => '', 'adminid' => 0, 'groupid' => 7, 'credits' => 0, 'timeoffset' => 9999));
  527.         }

  528.         /*
  529.          * 1、处理计划任务
  530.          */
  531.         function _init_cron() {
  532.                 $ext = empty($this->config['remote']['on']) || empty($this->config['remote']['cron']) || APPTYPEID == 200;
  533.                 if($this->init_cron && $this->init_setting && $ext) {
  534.                         if($this->var['cache']['cronnextrun'] <= TIMESTAMP) {
  535.                                 require_once libfile('class/cron');//加载"/source/class/class_cron.php"文件
  536.                                 discuz_cron::run();//运行
  537.                         }
  538.                 }
  539.         }

  540.         /*
  541.          * 1、杂项
  542.          * 2、调入核心语言包
  543.          * 3、处理全局时区设置
  544.          * 4、处理被封禁用户
  545.          * 5、站点开关检查
  546.          * 6、手机端控制每页显示主题数和回帖数
  547.          * 7、判断并执行每日登陆奖励积分
  548.          */
  549.         function _init_misc() {
  550.                 if(!$this->init_misc) {
  551.                         return false;
  552.                 }
  553.                 lang('core');//加载core语言包

  554.                 //设置用户时区
  555.                 if($this->init_setting && $this->init_user) {
  556.                         if(!isset($this->var['member']['timeoffset']) || $this->var['member']['timeoffset'] == 9999 || $this->var['member']['timeoffset'] === '') {
  557.                                 $this->var['member']['timeoffset'] = $this->var['setting']['timeoffset'];
  558.                         }
  559.                 }

  560.                 $timeoffset = $this->init_setting ? $this->var['member']['timeoffset'] : $this->var['setting']['timeoffset'];
  561.                 $this->var['timenow'] = array(
  562.                         'time' => dgmdate(TIMESTAMP),
  563.                         'offset' => $timeoffset >= 0 ? ($timeoffset == 0 ? '' : '+'.$timeoffset) : $timeoffset
  564.                 );
  565.                 $this->timezone_set($timeoffset);

  566.                 $this->var['formhash'] = formhash();//得到formhash
  567.                 define('FORMHASH', $this->var['formhash']);//定义为常量

  568.                 if($this->init_user) {
  569.                         if($this->var['group'] && isset($this->var['group']['allowvisit']) && !$this->var['group']['allowvisit']) {
  570.                                 if($this->var['uid']) {
  571.                                         sysmessage('user_banned', null);//检测是否为禁止访问
  572.                                 } elseif((!defined('ALLOWGUEST') || !ALLOWGUEST) && !in_array(CURSCRIPT, array('member', 'api')) && !$this->var['inajax']) {
  573.                                         dheader('location: member.php?mod=logging&action=login&referer='.rawurlencode($_SERVER['REQUEST_URI']));
  574.                                 }
  575.                         }
  576.                         if($this->var['member']['status'] == -1) {
  577.                                 sysmessage('user_banned', null);//如果用户状态为-1,则提示禁止访问
  578.                         }
  579.                 }

  580.                 if($this->var['setting']['ipaccess'] && !ipaccess($this->var['clientip'], $this->var['setting']['ipaccess'])) {
  581.                         sysmessage('user_banned', null);//ip权限检测
  582.                 }

  583.                 //如果论坛为关闭,只有管理员可以访问,其他则提示关闭原因
  584.                 if($this->var['setting']['bbclosed']) {
  585.                         if($this->var['uid'] && ($this->var['group']['allowvisit'] == 2 || $this->var['groupid'] == 1)) {
  586.                         } elseif(in_array(CURSCRIPT, array('admin', 'member', 'api')) || defined('ALLOWGUEST') && ALLOWGUEST) {
  587.                         } else {
  588.                                 $closedreason = DB::result_first("SELECT svalue FROM ".DB::table('common_setting')." WHERE skey='closedreason'");
  589.                                 $closedreason = str_replace(':', ':', $closedreason);
  590.                                 showmessage($closedreason ? $closedreason : 'board_closed', NULL, array('adminemail' => $this->var['setting']['adminemail']), array('login' => 1));
  591.                         }
  592.                 }

  593.                 if(CURSCRIPT != 'admin' && !(in_array($this->var['mod'], array('logging', 'seccode')))) {
  594.                         periodscheck('visitbanperiods');//私密板块访问设置
  595.                 }

  596.                 //wap访问设置
  597.                 if(defined('IN_MOBILE')) {
  598.                         $this->var['tpp'] = $this->var['setting']['mobile']['mobiletopicperpage'] ? intval($this->var['setting']['mobile']['mobiletopicperpage']) : 20;
  599.                         $this->var['ppp'] = $this->var['setting']['mobile']['mobilepostperpage'] ? intval($this->var['setting']['mobile']['mobilepostperpage']) : 5;
  600.                 } else {
  601.                         $this->var['tpp'] = $this->var['setting']['topicperpage'] ? intval($this->var['setting']['topicperpage']) : 20;
  602.                         $this->var['ppp'] = $this->var['setting']['postperpage'] ? intval($this->var['setting']['postperpage']) : 10;
  603.                 }

  604.                 //header头信息设置
  605.                 if($this->var['setting']['nocacheheaders']) {
  606.                         @header("Expires: -1");
  607.                         @header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);
  608.                         @header("Pragma: no-cache");
  609.                 }

  610.                 if($this->session->isnew && $this->var['uid']) {
  611.                         updatecreditbyaction('daylogin', $this->var['uid']);//每日登陆增加积分设置

  612.                         include_once libfile('function/stat');
  613.                         updatestat('login', 1);
  614.                         if(defined('IN_MOBILE')) {
  615.                                 updatestat('mobilelogin', 1);
  616.                         }
  617.                         if($this->var['setting']['connect']['allow'] && $this->var['member']['conisbind']) {
  618.                                 updatestat('connectlogin', 1);
  619.                         }
  620.                 }
  621.                 if($this->var['member']['conisbind'] && $this->var['setting']['connect']['newbiespan'] !== '') {
  622.                         $this->var['setting']['newbiespan'] = $this->var['setting']['connect']['newbiespan'];
  623.                 }

  624.                 $lastact = TIMESTAMP."\t".htmlspecialchars(basename($this->var['PHP_SELF']))."\t".htmlspecialchars($this->var['mod']);
  625.                 dsetcookie('lastact', $lastact, 86400);
  626.                 setglobal('currenturl_encode', base64_encode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']));

  627.                 if((!empty($this->var['gp_fromuid']) || !empty($this->var['gp_fromuser'])) && ($this->var['setting']['creditspolicy']['promotion_visit'] || $this->var['setting']['creditspolicy']['promotion_register'])) {
  628.                         require_once libfile('misc/promotion', 'include');
  629.                 }

  630.                 //seo关键词、描述
  631.                 $this->var['seokeywords'] = !empty($this->var['setting']['seokeywords'][CURSCRIPT]) ? $this->var['setting']['seokeywords'][CURSCRIPT] : '';
  632.                 $this->var['seodescription'] = !empty($this->var['setting']['seodescription'][CURSCRIPT]) ? $this->var['setting']['seodescription'][CURSCRIPT] : '';

  633.         }

  634.         /*
  635.          * 1、加载全局设置 setting 、风格 style 、 下一个任务 cronnextrun
  636.          */
  637.         function _init_setting() {
  638.                 if($this->init_setting) {
  639.                         if(empty($this->var['setting'])) {
  640.                                 $this->cachelist[] = 'setting';//缓存设置文件
  641.                         }

  642.                         if(empty($this->var['style'])) {
  643.                                 $this->cachelist[] = 'style_default';//风格缓存设置
  644.                         }

  645.                         if(!isset($this->var['cache']['cronnextrun'])) {
  646.                                 $this->cachelist[] = 'cronnextrun';//缓存计划任务
  647.                         }
  648.                 }

  649.                 !empty($this->cachelist) && loadcache($this->cachelist);

  650.                 if(!is_array($this->var['setting'])) {
  651.                         $this->var['setting'] = array();
  652.                 }

  653.                 if($this->var['member'] && $this->var['group']['radminid'] == 0 && $this->var['member']['adminid'] > 0 && $this->var['member']['groupid'] != $this->var['member']['adminid'] && !empty($this->var['cache']['admingroup_'.$this->var['member']['adminid']])) {
  654.                         $this->var['group'] = array_merge($this->var['group'], $this->var['cache']['admingroup_'.$this->var['member']['adminid']]);
  655.                 }
  656.         }

  657.         /*
  658.          * 1、处理当前界面风格
  659.          * 2、定义风格常量
  660.          */
  661.         function _init_style() {
  662.                 $styleid = !empty($this->var['cookie']['styleid']) ? $this->var['cookie']['styleid'] : 0;
  663.                 if(intval(!empty($this->var['forum']['styleid']))) {
  664.                         $this->var['cache']['style_default']['styleid'] = $styleid = $this->var['forum']['styleid'];
  665.                 } elseif(intval(!empty($this->var['category']['styleid']))) {
  666.                         $this->var['cache']['style_default']['styleid'] = $styleid = $this->var['category']['styleid'];
  667.                 }

  668.                 $styleid = intval($styleid);

  669.                 if($styleid && $styleid != $this->var['setting']['styleid']) {
  670.                         loadcache('style_'.$styleid);
  671.                         if($this->var['cache']['style_'.$styleid]) {
  672.                                 $this->var['style'] = $this->var['cache']['style_'.$styleid];
  673.                         }
  674.                 }

  675.                 define('IMGDIR', $this->var['style']['imgdir']);
  676.                 define('STYLEID', $this->var['style']['styleid']);
  677.                 define('VERHASH', $this->var['style']['verhash']);
  678.                 define('TPLDIR', $this->var['style']['tpldir']);
  679.                 define('TEMPLATEID', $this->var['style']['templateid']);
  680.         }

  681.         //初始化discuz内存读写引擎
  682.         function _init_memory() {
  683.                 $this->mem = new discuz_memory();
  684.                 if($this->init_memory) {
  685.                         $this->mem->init($this->config['memory']);
  686.                 }
  687.                 $this->var['memory'] = $this->mem->type;
  688.         }
  689.         //手机访问设置
  690.         function _init_mobile() {
  691.                 if(!$this->var['setting'] || !$this->init_mobile || !$this->var['setting']['mobile']['allowmobile'] || !is_array($this->var['setting']['mobile']) || IS_ROBOT) {
  692.                         $nomobile = true;//允许手机访问
  693.                         $unallowmobile = true;
  694.                 }

  695.                 if($_GET['mobile'] === 'no') {
  696.                         dsetcookie('mobile', 'no', 3600);
  697.                         $nomobile = true;
  698.                 } elseif($this->var['cookie']['mobile'] == 'no' && $_GET['mobile'] === 'yes') {
  699.                         dsetcookie('mobile', '');
  700.                 } elseif($this->var['cookie']['mobile'] == 'no') {
  701.                         $nomobile = true;
  702.                 }

  703.                 if(!checkmobile()) {//检测是否为手机访问
  704.                         $nomobile = true;
  705.                 }

  706.                 if($this->var['setting']['mobile']['mobilepreview'] && !$this->var['mobile'] && !$unallowmobile) {
  707.                         if($_GET['mobile'] === 'yes') {
  708.                                 dheader("Location:misc.php?mod=mobile");
  709.                         }
  710.                 }

  711.                 if($nomobile || (!$this->var['setting']['mobile']['mobileforward'] && $_GET['mobile'] !== 'yes')) {
  712.                         if($_SERVER['HTTP_HOST'] == $this->var['setting']['domain']['app']['mobile'] && $this->var['setting']['domain']['app']['default']) {
  713.                                 dheader("Location:http://".$this->var['setting']['domain']['app']['default'].$_SERVER['REQUEST_URI']);
  714.                         } else {
  715.                                 return;
  716.                         }
  717.                 }

  718.                 if(strpos($this->var['setting']['domain']['defaultindex'], CURSCRIPT) !== false && CURSCRIPT != 'forum' && !$_GET['mod']) {
  719.                         if($this->var['setting']['domain']['app']['mobile']) {
  720.                                 $mobileurl = 'http://'.$this->var['setting']['domain']['app']['mobile'];
  721.                         } else {
  722.                                 if($this->var['setting']['domain']['app']['forum']) {
  723.                                         $mobileurl = 'http://'.$this->var['setting']['domain']['app']['forum'].'?mobile=yes';
  724.                                 } else {
  725.                                         $mobileurl = $this->var['siteurl'].'forum.php?mobile=yes';
  726.                                 }
  727.                         }
  728.                         dheader("location:$mobileurl");
  729.                 }
  730.                 define('IN_MOBILE', true);
  731.                 setglobal('gzipcompress', 0);

  732.                 $arr = array(strstr($_SERVER['QUERY_STRING'], '&simpletype'), strstr($_SERVER['QUERY_STRING'], 'simpletype'), '&mobile=yes', 'mobile=yes');
  733.                 $query_sting_tmp = str_replace($arr, '', $_SERVER['QUERY_STRING']);
  734.                 $this->var['setting']['mobile']['nomobileurl'] = ($this->var['setting']['domain']['app']['forum'] ? 'http://'.$this->var['setting']['domain']['app']['forum'].'/' : $this->var['siteurl']).$this->var['basefilename'].($query_sting_tmp ? '?'.$query_sting_tmp.'&' : '?').'mobile=no';

  735.                 $this->var['setting']['lazyload'] = 0;

  736.                 if('utf-8' != CHARSET) {
  737.                         if(strtolower($_SERVER['REQUEST_METHOD']) === 'post') {
  738.                                 foreach($_POST AS $pk => $pv) {
  739.                                         if(!is_numeric($pv)) {
  740.                                                 $this->var['gp_'.$pk] = $_GET[$pk] = $_POST[$pk] = $this->mobile_iconv_recurrence($pv);
  741.                                         }
  742.                                 }
  743.                         }
  744.                 }

  745.                 if($_GET['simpletype']) {
  746.                         if($_GET['simpletype'] == 'yes') {
  747.                                 $this->var['setting']['mobile']['mobilesimpletype'] = 1;
  748.                                 dsetcookie('simpletype', 1, 86400);
  749.                         } else {
  750.                                 $this->var['setting']['mobile']['mobilesimpletype'] = 0;
  751.                                 dsetcookie('simpletype', 0, 86400);
  752.                         }
  753.                 } elseif($this->var['cookie']['simpletype']) {
  754.                         $this->var['setting']['mobile']['mobilesimpletype'] = $this->var['cookie']['simpletype'] == 1 ? 1 : 0 ;
  755.                 }

  756.                 if(!$this->var['setting']['mobile']['mobilesimpletype']) {
  757.                         $this->var['setting']['imagemaxwidth'] = 224;
  758.                 }

  759.                 $this->var['setting']['regstatus'] = $this->var['setting']['mobile']['mobileregister'] ? $this->var['setting']['regstatus'] : 0 ;
  760.                 if(!$this->var['setting']['mobile']['mobileseccode']) {
  761.                         $this->var['setting']['seccodestatus'] = 0;
  762.                 }

  763.                 $this->var['setting']['seccodedata']['type'] = 99;
  764.                 $this->var['setting']['thumbquality'] = 50;


  765.                 $this->var['setting']['mobile']['simpletypeurl'] = array();
  766.                 $this->var['setting']['mobile']['simpletypeurl'][0] = $this->var['siteurl'].$this->var['basefilename'].($query_sting_tmp ? '?'.$query_sting_tmp.'&' : '?').'mobile=yes&simpletype=no';
  767.                 $this->var['setting']['mobile']['simpletypeurl'][1] =  $this->var['siteurl'].$this->var['basefilename'].($query_sting_tmp ? '?'.$query_sting_tmp.'&' : '?').'mobile=yes&simpletype=yes';
  768.                 unset($query_sting_tmp);
  769.                 ob_start();
  770.         }

  771.         //时区设置
  772.         function timezone_set($timeoffset = 0) {
  773.                 if(function_exists('date_default_timezone_set')) {
  774.                         @date_default_timezone_set('Etc/GMT'.($timeoffset > 0 ? '-' : '+').(abs($timeoffset)));
  775.                 }
  776.         }

  777.         //手机访问再次转码
  778.         function mobile_iconv_recurrence($value) {
  779.                 if(is_array($value)) {
  780.                         foreach($value AS $key => $val) {
  781.                                 $value[$key] = $this->mobile_iconv_recurrence($val);
  782.                         }
  783.                 } else {
  784.                         $value = addslashes(diconv(stripslashes($value), 'utf-8', CHARSET));
  785.                 }
  786.                 return $value;
  787.         }
  788. }

  789. /**
  790. * Discuz MySQL 类的支持 程序中不直接使用
  791. *
  792. */
  793. class db_mysql
  794. {
  795.         var $tablepre;
  796.         var $version = '';
  797.         var $querynum = 0;
  798.         var $slaveid = 0;
  799.         var $curlink;
  800.         var $link = array();
  801.         var $config = array();
  802.         var $sqldebug = array();
  803.         var $map = array();

  804.         function db_mysql($config = array()) {
  805.                 if(!empty($config)) {
  806.                         $this->set_config($config);
  807.                 }
  808.         }

  809.         function set_config($config) {
  810.                 $this->config = &$config;
  811.                 $this->tablepre = $config['1']['tablepre'];
  812.                 if(!empty($this->config['map'])) {
  813.                         $this->map = $this->config['map'];
  814.                 }
  815.         }

  816.         function connect($serverid = 1) {

  817.                 if(empty($this->config) || empty($this->config[$serverid])) {
  818.                         $this->halt('config_db_not_found');
  819.                 }

  820.                 $this->link[$serverid] = $this->_dbconnect(
  821.                         $this->config[$serverid]['dbhost'],
  822.                         $this->config[$serverid]['dbuser'],
  823.                         $this->config[$serverid]['dbpw'],
  824.                         $this->config[$serverid]['dbcharset'],
  825.                         $this->config[$serverid]['dbname'],
  826.                         $this->config[$serverid]['pconnect']
  827.                         );
  828.                 $this->curlink = $this->link[$serverid];

  829.         }

  830.         function _dbconnect($dbhost, $dbuser, $dbpw, $dbcharset, $dbname, $pconnect) {
  831.                 $link = null;
  832.                 $func = empty($pconnect) ? 'mysql_connect' : 'mysql_pconnect';
  833.                 if(!$link = @$func($dbhost, $dbuser, $dbpw, 1)) {
  834.                         $this->halt('notconnect');
  835.                 } else {
  836.                         $this->curlink = $link;
  837.                         if($this->version() > '4.1') {
  838.                                 $dbcharset = $dbcharset ? $dbcharset : $this->config[1]['dbcharset'];
  839.                                 $serverset = $dbcharset ? 'character_set_connection='.$dbcharset.', character_set_results='.$dbcharset.', character_set_client=binary' : '';
  840.                                 $serverset .= $this->version() > '5.0.1' ? ((empty($serverset) ? '' : ',').'sql_mode=\'\'') : '';
  841.                                 $serverset && mysql_query("SET $serverset", $link);
  842.                         }
  843.                         $dbname && @mysql_select_db($dbname, $link);
  844.                 }
  845.                 return $link;
  846.         }

  847.         function table_name($tablename) {
  848.                 if(!empty($this->map) && !empty($this->map[$tablename])) {
  849.                         $id = $this->map[$tablename];
  850.                         if(!$this->link[$id]) {
  851.                                 $this->connect($id);
  852.                         }
  853.                         $this->curlink = $this->link[$id];
  854.                         return $this->config[$id]['tablepre'].$tablename;
  855.                 } else {
  856.                         $this->curlink = $this->link[1];
  857.                 }
  858.                 return $this->tablepre.$tablename;
  859.         }

  860.         function select_db($dbname) {
  861.                 return mysql_select_db($dbname, $this->curlink);
  862.         }

  863.         function fetch_array($query, $result_type = MYSQL_ASSOC) {
  864.                 return mysql_fetch_array($query, $result_type);
  865.         }

  866.         function fetch_first($sql) {
  867.                 return $this->fetch_array($this->query($sql));
  868.         }

  869.         function result_first($sql) {
  870.                 return $this->result($this->query($sql), 0);
  871.         }

  872.         function query($sql, $type = '') {

  873.                 if(defined('DISCUZ_DEBUG') && DISCUZ_DEBUG) {
  874.                         $starttime = dmicrotime();
  875.                 }
  876.                 $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?
  877.                 'mysql_unbuffered_query' : 'mysql_query';
  878.                 if(!($query = $func($sql, $this->curlink))) {
  879.                         if(in_array($this->errno(), array(2006, 2013)) && substr($type, 0, 5) != 'RETRY') {
  880.                                 $this->connect();
  881.                                 return $this->query($sql, 'RETRY'.$type);
  882.                         }
  883.                         if($type != 'SILENT' && substr($type, 5) != 'SILENT') {
  884.                                 $this->halt('query_error', $sql);
  885.                         }
  886.                 }

  887.                 if(defined('DISCUZ_DEBUG') && DISCUZ_DEBUG) {
  888.                         $this->sqldebug[] = array($sql, number_format((dmicrotime() - $starttime), 6), debug_backtrace());
  889.                 }

  890.                 $this->querynum++;
  891.                 return $query;
  892.         }

  893.         function affected_rows() {
  894.                 return mysql_affected_rows($this->curlink);
  895.         }

  896.         function error() {
  897.                 return (($this->curlink) ? mysql_error($this->curlink) : mysql_error());
  898.         }

  899.         function errno() {
  900.                 return intval(($this->curlink) ? mysql_errno($this->curlink) : mysql_errno());
  901.         }

  902.         function result($query, $row = 0) {
  903.                 $query = @mysql_result($query, $row);
  904.                 return $query;
  905.         }

  906.         function num_rows($query) {
  907.                 $query = mysql_num_rows($query);
  908.                 return $query;
  909.         }

  910.         function num_fields($query) {
  911.                 return mysql_num_fields($query);
  912.         }

  913.         function free_result($query) {
  914.                 return mysql_free_result($query);
  915.         }

  916.         function insert_id() {
  917.                 return ($id = mysql_insert_id($this->curlink)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0);
  918.         }

  919.         function fetch_row($query) {
  920.                 $query = mysql_fetch_row($query);
  921.                 return $query;
  922.         }

  923.         function fetch_fields($query) {
  924.                 return mysql_fetch_field($query);
  925.         }

  926.         function version() {
  927.                 if(empty($this->version)) {
  928.                         $this->version = mysql_get_server_info($this->curlink);
  929.                 }
  930.                 return $this->version;
  931.         }

  932.         function close() {
  933.                 return mysql_close($this->curlink);
  934.         }

  935.         function halt($message = '', $sql = '') {
  936.                 require_once libfile('class/error');
  937.                 discuz_error::db_error($message, $sql);
  938.         }

  939. }

  940. /**
  941. * 对Discuz CORE 中 DB Object中的主要方法进行二次封装,方便程序调用
  942. *
  943. */
  944. class DB
  945. {

  946.         /**
  947.          * 返回表名(pre_$table)
  948.          *
  949.          * @param 原始表名 $table
  950.          * @return 增加pre之后的名字
  951.          */
  952.         function table($table) {
  953.                 return DB::_execute('table_name', $table);
  954.         }

  955.         /**
  956.          * 删除一条或者多条记录
  957.          *
  958.          * @param string $table 原始表名
  959.          * @param string $condition 条件语句,不需要写WHERE
  960.          * @param int $limit 删除条目数
  961.          * @param boolean $unbuffered 立即返回?
  962.          */
  963.         function delete($table, $condition, $limit = 0, $unbuffered = true) {
  964.                 if(empty($condition)) {
  965.                         $where = '1';
  966.                 } elseif(is_array($condition)) {
  967.                         $where = DB::implode_field_value($condition, ' AND ');
  968.                 } else {
  969.                         $where = $condition;
  970.                 }
  971.                 $sql = "DELETE FROM ".DB::table($table)." WHERE $where ".($limit ? "LIMIT $limit" : '');
  972.                 return DB::query($sql, ($unbuffered ? 'UNBUFFERED' : ''));
  973.         }

  974.         /**
  975.          * 插入一条记录
  976.          *
  977.          * @param string $table 原始表名
  978.          * @param array $data 数组field->vlaue 对
  979.          * @param boolen $return_insert_id 返回 InsertID?
  980.          * @param boolen $replace 是否是REPLACE模式
  981.          * @param boolen $silent 屏蔽错误?
  982.          * @return InsertID or Result
  983.          */
  984.         function insert($table, $data, $return_insert_id = false, $replace = false, $silent = false) {

  985.                 $sql = DB::implode_field_value($data);

  986.                 $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';

  987.                 $table = DB::table($table);
  988.                 $silent = $silent ? 'SILENT' : '';

  989.                 $return = DB::query("$cmd $table SET $sql", $silent);

  990.                 return $return_insert_id ? DB::insert_id() : $return;

  991.         }

  992.         /**
  993.          * 更新一条或者多条数据记录
  994.          *
  995.          * @param string $table 原始表名
  996.          * @param array $data 数据field-value
  997.          * @param string $condition 条件语句,不需要写WHERE
  998.          * @param boolean $unbuffered 迅速返回?
  999.          * @param boolan $low_priority 延迟更新?
  1000.          * @return result
  1001.          */
  1002.         function update($table, $data, $condition, $unbuffered = false, $low_priority = false) {
  1003.                 $sql = DB::implode_field_value($data);
  1004.                 $cmd = "UPDATE ".($low_priority ? 'LOW_PRIORITY' : '');
  1005.                 $table = DB::table($table);
  1006.                 $where = '';
  1007.                 if(empty($condition)) {
  1008.                         $where = '1';
  1009.                 } elseif(is_array($condition)) {
  1010.                         $where = DB::implode_field_value($condition, ' AND ');
  1011.                 } else {
  1012.                         $where = $condition;
  1013.                 }
  1014.                 $res = DB::query("$cmd $table SET $sql WHERE $where", $unbuffered ? 'UNBUFFERED' : '');
  1015.                 return $res;
  1016.         }

  1017.         /**
  1018.          * 格式化field字段和value,并组成一个字符串
  1019.          *
  1020.          * @param array $array 格式为 key=>value 数组
  1021.          * @param 分割符 $glue
  1022.          * @return string
  1023.          */
  1024.         function implode_field_value($array, $glue = ',') {
  1025.                 $sql = $comma = '';
  1026.                 foreach ($array as $k => $v) {
  1027.                         $sql .= $comma."`$k`='$v'";
  1028.                         $comma = $glue;
  1029.                 }
  1030.                 return $sql;
  1031.         }

  1032.         /**
  1033.          * 返回插入的ID
  1034.          *
  1035.          * @return int
  1036.          */
  1037.         function insert_id() {
  1038.                 return DB::_execute('insert_id');
  1039.         }

  1040.         /**
  1041.          * 依据查询结果,返回一行数据
  1042.          *
  1043.          * @param resourceID $resourceid
  1044.          * @return array
  1045.          */
  1046.         function fetch($resourceid, $type = MYSQL_ASSOC) {
  1047.                 return DB::_execute('fetch_array', $resourceid, $type);
  1048.         }

  1049.         /**
  1050.          * 依据SQL语句,返回第一条查询结果
  1051.          *
  1052.          * @param string $query 查询语句
  1053.          * @return array
  1054.          */
  1055.         function fetch_first($sql) {
  1056.                 DB::checkquery($sql);
  1057.                 return DB::_execute('fetch_first', $sql);
  1058.         }

  1059.         /**
  1060.          * 依据查询结果,返回结果数值
  1061.          *
  1062.          * @param resourceid $resourceid
  1063.          * @return string or int
  1064.          */
  1065.         function result($resourceid, $row = 0) {
  1066.                 return DB::_execute('result', $resourceid, $row);
  1067.         }

  1068.         /**
  1069.          * 依据查询语句,返回结果数值
  1070.          *
  1071.          * @param string $query SQL查询语句
  1072.          * @return unknown
  1073.          */
  1074.         function result_first($sql) {
  1075.                 DB::checkquery($sql);
  1076.                 return DB::_execute('result_first', $sql);
  1077.         }

  1078.         /**
  1079.          * 执行查询
  1080.          *
  1081.          * @param string $sql
  1082.          * @param 类型定义 $type UNBUFFERED OR SILENT
  1083.          * @return Resource OR Result
  1084.          */
  1085.         function query($sql, $type = '') {
  1086.                 DB::checkquery($sql);
  1087.                 return DB::_execute('query', $sql, $type);
  1088.         }

  1089.         /**
  1090.          * 返回select的结果行数
  1091.          *
  1092.          * @param resource $resourceid
  1093.          * @return int
  1094.          */
  1095.         function num_rows($resourceid) {
  1096.                 return DB::_execute('num_rows', $resourceid);
  1097.         }

  1098.         /**
  1099.          * 返回sql语句所影响的记录行数
  1100.          *
  1101.          * @return int
  1102.          */
  1103.         function affected_rows() {
  1104.                 return DB::_execute('affected_rows');
  1105.         }

  1106.         function free_result($query) {
  1107.                 return DB::_execute('free_result', $query);
  1108.         }

  1109.         function error() {
  1110.                 return DB::_execute('error');
  1111.         }

  1112.         function errno() {
  1113.                 return DB::_execute('errno');
  1114.         }

  1115.         function _execute($cmd , $arg1 = '', $arg2 = '') {
  1116.                 static $db;
  1117.                 if(empty($db)) $db = & DB::object();
  1118.                 $res = $db->$cmd($arg1, $arg2);
  1119.                 return $res;
  1120.         }

  1121.         /**
  1122.          * 返回 DB object 指针
  1123.          *
  1124.          * @return pointer of db object from discuz core
  1125.          */
  1126.         function &object($dbclass = 'db_mysql') {
  1127.                 static $db;
  1128.                 if(empty($db)) $db = new $dbclass();
  1129.                 return $db;
  1130.         }

  1131.         function checkquery($sql) {
  1132.                 static $status = null, $checkcmd = array('SELECT', 'UPDATE', 'INSERT', 'REPLACE', 'DELETE');
  1133.                 if($status === null) $status = getglobal('config/security/querysafe/status');
  1134.                 if($status) {
  1135.                         $cmd = trim(strtoupper(substr($sql, 0, strpos($sql, ' '))));
  1136.                         if(in_array($cmd, $checkcmd)) {
  1137.                                 $test = DB::_do_query_safe($sql);
  1138.                                 if($test < 1) DB::_execute('halt', 'security_error', $sql);
  1139.                         }
  1140.                 }
  1141.                 return true;
  1142.         }

  1143.         function _do_query_safe($sql) {
  1144.                 static $_CONFIG = null;
  1145.                 if($_CONFIG === null) {
  1146.                         $_CONFIG = getglobal('config/security/querysafe');
  1147.                 }

  1148.                 $sql = str_replace(array('\\\\', '\\\'', '\\"', '\'\''), '', $sql);
  1149.                 $mark = $clean = '';
  1150.                 if(strpos($sql, '/') === false && strpos($sql, '#') === false && strpos($sql, '-- ') === false) {
  1151.                         $clean = preg_replace("/'(.+?)'/s", '', $sql);
  1152.                 } else {
  1153.                         $len = strlen($sql);
  1154.                         $mark = $clean = '';
  1155.                         for ($i = 0; $i <$len; $i++) {
  1156.                                 $str = $sql[$i];
  1157.                                 switch ($str) {
  1158.                                         case '\'':
  1159.                                                 if(!$mark) {
  1160.                                                         $mark = '\'';
  1161.                                                         $clean .= $str;
  1162.                                                 } elseif ($mark == '\'') {
  1163.                                                         $mark = '';
  1164.                                                 }
  1165.                                                 break;
  1166.                                         case '/':
  1167.                                                 if(empty($mark) && $sql[$i+1] == '*') {
  1168.                                                         $mark = '/*';
  1169.                                                         $clean .= $mark;
  1170.                                                         $i++;
  1171.                                                 } elseif($mark == '/*' && $sql[$i -1] == '*') {
  1172.                                                         $mark = '';
  1173.                                                         $clean .= '*';
  1174.                                                 }
  1175.                                                 break;
  1176.                                         case '#':
  1177.                                                 if(empty($mark)) {
  1178.                                                         $mark = $str;
  1179.                                                         $clean .= $str;
  1180.                                                 }
  1181.                                                 break;
  1182.                                         case "\n":
  1183.                                                 if($mark == '#' || $mark == '--') {
  1184.                                                         $mark = '';
  1185.                                                 }
  1186.                                                 break;
  1187.                                         case '-':
  1188.                                                 if(empty($mark)&& substr($sql, $i, 3) == '-- ') {
  1189.                                                         $mark = '-- ';
  1190.                                                         $clean .= $mark;
  1191.                                                 }
  1192.                                                 break;

  1193.                                         default:

  1194.                                                 break;
  1195.                                 }
  1196.                                 $clean .= $mark ? '' : $str;
  1197.                         }
  1198.                 }

  1199.                 $clean = preg_replace("/[^a-z0-9_\-\(\)#\*\/\"]+/is", "", strtolower($clean));

  1200.                 if($_CONFIG['afullnote']) {
  1201.                         $clean = str_replace('/**/','',$clean);
  1202.                 }

  1203.                 if(is_array($_CONFIG['dfunction'])) {
  1204.                         foreach($_CONFIG['dfunction'] as $fun) {
  1205.                                 if(strpos($clean, $fun.'(') !== false) return '-1';
  1206.                         }
  1207.                 }

  1208.                 if(is_array($_CONFIG['daction'])) {
  1209.                         foreach($_CONFIG['daction'] as $action) {
  1210.                                 if(strpos($clean,$action) !== false) return '-3';
  1211.                         }
  1212.                 }

  1213.                 if($_CONFIG['dlikehex'] && strpos($clean, 'like0x')) {
  1214.                         return '-2';
  1215.                 }

  1216.                 if(is_array($_CONFIG['dnote'])) {
  1217.                         foreach($_CONFIG['dnote'] as $note) {
  1218.                                 if(strpos($clean,$note) !== false) return '-4';
  1219.                         }
  1220.                 }

  1221.                 return 1;

  1222.         }

  1223. }

  1224. //session类
  1225. class discuz_session {

  1226.         var $sid = null;
  1227.         var $var;
  1228.         var $isnew = false;
  1229.         //初始化session数组
  1230.         var $newguest = array('sid' => 0, 'ip1' => 0, 'ip2' => 0, 'ip3' => 0, 'ip4' => 0,
  1231.         'uid' => 0, 'username' => '', 'groupid' => 7, 'invisible' => 0, 'action' => 0,
  1232.         'lastactivity' => 0, 'fid' => 0, 'tid' => 0, 'lastolupdate' => 0);

  1233.         var $old =  array('sid' =>  '', 'ip' =>  '', 'uid' =>  0);

  1234.         function discuz_session($sid = '', $ip = '', $uid = 0) {
  1235.                 $this->old = array('sid' =>  $sid, 'ip' =>  $ip, 'uid' =>  $uid);
  1236.                 $this->var = $this->newguest;
  1237.                 if(!empty($ip)) {
  1238.                         $this->init($sid, $ip, $uid);
  1239.                 }
  1240.         }

  1241.         //设置
  1242.         function set($key, $value) {
  1243.                 if(isset($this->newguest[$key])) {
  1244.                         $this->var[$key] = $value;
  1245.                 } elseif ($key == 'ip') {
  1246.                         $ips = explode('.', $value);
  1247.                         $this->set('ip1', $ips[0]);
  1248.                         $this->set('ip2', $ips[1]);
  1249.                         $this->set('ip3', $ips[2]);
  1250.                         $this->set('ip4', $ips[3]);
  1251.                 }
  1252.         }

  1253.         //获取
  1254.         function get($key) {
  1255.                 if(isset($this->newguest[$key])) {
  1256.                         return $this->var[$key];
  1257.                 } elseif ($key == 'ip') {
  1258.                         return $this->get('ip1').'.'.$this->get('ip2').'.'.$this->get('ip3').'.'.$this->get('ip4');
  1259.                 }
  1260.         }

  1261.         //初始化
  1262.         function init($sid, $ip, $uid) {
  1263.                 $this->old = array('sid' =>  $sid, 'ip' =>  $ip, 'uid' =>  $uid);
  1264.                 $session = array();
  1265.                 if($sid) {
  1266.                         $session = DB::fetch_first("SELECT * FROM ".DB::table('common_session').
  1267.                                 " WHERE sid='$sid' AND CONCAT_WS('.', ip1,ip2,ip3,ip4)='$ip'");
  1268.                 }

  1269.                 if(empty($session) || $session['uid'] != $uid) {
  1270.                         $session = $this->create($ip, $uid);
  1271.                 }

  1272.                 $this->var = $session;
  1273.                 $this->sid = $session['sid'];
  1274.         }

  1275.         //创建
  1276.         function create($ip, $uid) {

  1277.                 $this->isnew = true;
  1278.                 $this->var = $this->newguest;
  1279.                 $this->set('sid', random(6));
  1280.                 $this->set('uid', $uid);
  1281.                 $this->set('ip', $ip);
  1282.                 $uid && $this->set('invisible', getuserprofile('invisible'));
  1283.                 $this->set('lastactivity', time());
  1284.                 $this->sid = $this->var['sid'];

  1285.                 return $this->var;
  1286.         }

  1287.         //删除
  1288.         function delete() {

  1289.                 global $_G;
  1290.                 $onlinehold = $_G['setting']['onlinehold'];
  1291.                 $guestspan = 60;

  1292.                 $onlinehold = time() - $onlinehold;
  1293.                 $guestspan = time() - $guestspan;

  1294.                 $condition = " sid='{$this->sid}' ";
  1295.                 $condition .= " OR lastactivity<$onlinehold ";
  1296.                 $condition .= " OR (uid='0' AND ip1='{$this->var['ip1']}' AND ip2='{$this->var['ip2']}' AND ip3='{$this->var['ip3']}' AND ip4='{$this->var['ip4']}' AND lastactivity>$guestspan) ";
  1297.                 $condition .= $this->var['uid'] ? " OR (uid='{$this->var['uid']}') " : '';
  1298.                 DB::delete('common_session', $condition);
  1299.         }

  1300.         //更新数据
  1301.         function update() {
  1302.                 global $_G;
  1303.                 if($this->sid !== null) {

  1304.                         $data = daddslashes($this->var);
  1305.                         if($this->isnew) {
  1306.                                 $this->delete();
  1307.                                 DB::insert('common_session', $data, false, false, true);
  1308.                         } else {
  1309.                                 DB::update('common_session', $data, "sid='$data[sid]'");
  1310.                         }
  1311.                         $_G['session'] = $data;
  1312.                         dsetcookie('sid', $this->sid, 86400);
  1313.                 }
  1314.         }

  1315.         /**
  1316.          * 取在线用户数量
  1317.          *
  1318.          * @param int $type 0=全部 1=会员 2=游客
  1319.          * @return int
  1320.          */
  1321.         function onlinecount($type = 0) {
  1322.                 $condition = $type == 1 ? ' WHERE uid>0 ' : ($type == 2 ? ' WHERE invisible=1 ' : '');
  1323.                 return DB::result_first("SELECT count(*) FROM ".DB::table('common_session').$condition);
  1324.         }

  1325. }


  1326. class discuz_process
  1327. {
  1328.         function islocked($process, $ttl = 0) {
  1329.                 $ttl = $ttl < 1 ? 600 : intval($ttl);
  1330.                 if(discuz_process::_status('get', $process)) {
  1331.                         return true;
  1332.                 } else {
  1333.                         return discuz_process::_find($process, $ttl);
  1334.                 }
  1335.         }

  1336.         function unlock($process) {
  1337.                 discuz_process::_status('rm', $process);
  1338.                 discuz_process::_cmd('rm', $process);
  1339.         }

  1340.         function _status($action, $process) {
  1341.                 static $plist = array();
  1342.                 switch ($action) {
  1343.                         case 'set' : $plist[$process] = true; break;
  1344.                         case 'get' : return !empty($plist[$process]); break;
  1345.                         case 'rm' : $plist[$process] = null; break;
  1346.                         case 'clear' : $plist = array(); break;
  1347.                 }
  1348.                 return true;
  1349.         }

  1350.         function _find($name, $ttl) {

  1351.                 if(!discuz_process::_cmd('get', $name)) {
  1352.                         discuz_process::_cmd('set', $name, $ttl);
  1353.                         $ret = false;
  1354.                 } else {
  1355.                         $ret = true;
  1356.                 }
  1357.                 discuz_process::_status('set', $name);
  1358.                 return $ret;
  1359.         }

  1360.         function _cmd($cmd, $name, $ttl = 0) {
  1361.                 static $allowmem;
  1362.                 if($allowmem === null) {
  1363.                         $allowmem = memory('check') == 'memcache';
  1364.                 }
  1365.                 if($allowmem) {
  1366.                         return discuz_process::_process_cmd_memory($cmd, $name, $ttl);
  1367.                 } else {
  1368.                         return discuz_process::_process_cmd_db($cmd, $name, $ttl);
  1369.                 }
  1370.         }

  1371.         function _process_cmd_memory($cmd, $name, $ttl = 0) {
  1372.                 return memory($cmd, 'process_lock_'.$name, time(), $ttl);
  1373.         }

  1374.         function _process_cmd_db($cmd, $name, $ttl = 0) {
  1375.                 $ret = '';
  1376.                 switch ($cmd) {
  1377.                         case 'set':
  1378.                                 $ret = DB::insert('common_process', array('processid' => $name, 'expiry' => time() + $ttl), false, true);
  1379.                                 break;
  1380.                         case 'get':
  1381.                                 $ret = DB::fetch_first("SELECT * FROM ".DB::table('common_process')." WHERE processid='$name'");
  1382.                                 if(empty($ret) || $ret['expiry'] < time()) {
  1383.                                         $ret = false;
  1384.                                 } else {
  1385.                                         $ret = true;
  1386.                                 }
  1387.                                 break;
  1388.                         case 'rm':
  1389.                                 $ret = DB::delete('common_process', "processid='$name' OR expiry<".time());
  1390.                                 break;
  1391.                 }
  1392.                 return $ret;
  1393.         }
  1394. }

  1395. /**
  1396. * Discuz 内存读写引擎
  1397. * 支持 memcache, eAccelerator, XCache
  1398. *
  1399. * 使用的时候建议直接利用函数 memory()
  1400. */
  1401. class discuz_memory
  1402. {
  1403.         var $config;
  1404.         var $extension = array();
  1405.         var $memory;
  1406.         var $prefix;
  1407.         var $type;
  1408.         var $keys;
  1409.         var $enable = false;

  1410.         /**
  1411.          * 确认当前系统支持的内存读写接口
  1412.          * @return discuz_memory
  1413.          */
  1414.         function discuz_memory() {
  1415.                 $this->extension['eaccelerator'] = function_exists('eaccelerator_get');
  1416.                 $this->extension['apc'] = function_exists('apc_fetch');
  1417.                 $this->extension['xcache'] = function_exists('xcache_get');
  1418.                 $this->extension['memcache'] = extension_loaded('memcache');
  1419.         }

  1420.         /**
  1421.          * 依据config当中设置,初始化内存引擎
  1422.          * @param unknown_type $config
  1423.          */
  1424.         function init($config) {

  1425.                 $this->config = $config;
  1426.                 $this->prefix = empty($config['prefix']) ? substr(md5($_SERVER['HTTP_HOST']), 0, 6).'_' : $config['prefix'];
  1427.                 $this->keys = array();

  1428.                 if($this->extension['memcache'] && !empty($config['memcache']['server'])) {
  1429.                         require_once libfile('class/memcache');
  1430.                         $this->memory = new discuz_memcache();
  1431.                         $this->memory->init($this->config['memcache']);
  1432.                         if(!$this->memory->enable) {
  1433.                                 $this->memory = null;
  1434.                         }
  1435.                 }

  1436.                 if(!is_object($this->memory) && $this->extension['eaccelerator'] && $this->config['eaccelerator']) {
  1437.                         require_once libfile('class/eaccelerator');
  1438.                         $this->memory = new discuz_eaccelerator();
  1439.                         $this->memory->init(null);
  1440.                 }

  1441.                 if(!is_object($this->memory) && $this->extension['xcache'] && $this->config['xcache']) {
  1442.                         require_once libfile('class/xcache');
  1443.                         $this->memory = new discuz_xcache();
  1444.                         $this->memory->init(null);
  1445.                 }

  1446.                 if(!is_object($this->memory) && $this->extension['apc'] && $this->config['apc']) {
  1447.                         require_once libfile('class/apc');
  1448.                         $this->memory = new discuz_apc();
  1449.                         $this->memory->init(null);
  1450.                 }

  1451.                 if(is_object($this->memory)) {
  1452.                         $this->enable = true;
  1453.                         $this->type = str_replace('discuz_', '', get_class($this->memory));
  1454.                         $this->keys = $this->get('memory_system_keys');
  1455.                         $this->keys = !is_array($this->keys) ? array() : $this->keys;
  1456.                 }

  1457.         }

  1458.         /**
  1459.          * 读取内存
  1460.          *
  1461.          * @param string $key
  1462.          * @return mix
  1463.          */
  1464.         function get($key) {
  1465.                 $ret = null;
  1466.                 if($this->enable) {
  1467.                         $ret = $this->memory->get($this->_key($key));
  1468.                         if(!is_array($ret)) {
  1469.                                 $ret = null;
  1470.                                 if(array_key_exists($key, $this->keys)) {
  1471.                                         unset($this->keys[$key]);
  1472.                                         $this->memory->set($this->_key('memory_system_keys'), array($this->keys));
  1473.                                 }
  1474.                         } else {
  1475.                                 return $ret[0];
  1476.                         }
  1477.                 }
  1478.                 return $ret;
  1479.         }

  1480.         /**
  1481.          * 写入内存
  1482.          *
  1483.          * @param string $key
  1484.          * @param array_string_number $value
  1485.          * @param int过期时间 $ttl
  1486.          * @return boolean
  1487.          */
  1488.         function set($key, $value, $ttl = 0) {

  1489.                 $ret = null;
  1490.                 if($this->enable) {
  1491.                         $ret = $this->memory->set($this->_key($key), array($value), $ttl);
  1492.                         if($ret) {
  1493.                                 $this->keys[$key] = true;
  1494.                                 $this->memory->set($this->_key('memory_system_keys'), array($this->keys));
  1495.                         }
  1496.                 }
  1497.                 return $ret;
  1498.         }

  1499.         /**
  1500.          * 删除一个内存单元
  1501.          * @param 键值string $key
  1502.          * @return boolean
  1503.          */
  1504.         function rm($key) {
  1505.                 $ret = null;
  1506.                 if($this->enable) {
  1507.                         $ret = $this->memory->rm($this->_key($key));
  1508.                         unset($this->keys[$key]);
  1509.                         $this->memory->set($this->_key('memory_system_keys'), array($this->keys));
  1510.                 }
  1511.                 return $ret;
  1512.         }

  1513.         /**
  1514.          * 清除当前使用的所有内存
  1515.          */
  1516.         function clear() {
  1517.                 if($this->enable && is_array($this->keys)) {
  1518.                         if(method_exists($this->memory, 'clear')) {
  1519.                                 $this->memory->clear();
  1520.                         } else {
  1521.                                 $this->keys['memory_system_keys'] = true;
  1522.                                 foreach ($this->keys as $k => $v) {
  1523.                                         $this->memory->rm($this->_key($k));
  1524.                                 }
  1525.                         }
  1526.                 }
  1527.                 $this->keys = array();
  1528.                 return true;
  1529.         }

  1530.         /**
  1531.          * 内部函数 追加键值前缀
  1532.          * @param string $str
  1533.          * @return boolean
  1534.          */
  1535.         function _key($str) {
  1536.                 return ($this->prefix).$str;
  1537.         }

  1538. }

  1539. ?>
复制代码


更多Discuz二次开发相关源码分析
1、discuz核心类库class_core的函数注释
http://bbs.zb7.com/thread-514094-1-1.html
2、Discuz的forum_index.php文件的分析
http://bbs.zb7.com/thread-517467-1-1.html
3、discuz x3 与通知表有关的程序源代码分析
http://bbs.zb7.com/thread-517471-1-1.html
4、discuz x3 space_notice.php分析注释
http://bbs.zb7.com/thread-517472-1-1.html
5、discuz x3 uc_client/client.php接口文件分析
http://bbs.zb7.com/thread-517473-1-1.html
6、Discuz中session机制流程图
http://bbs.zb7.com/thread-517443-1-1.html



上一篇:discuz x3的全局$_G变量的介绍
下一篇:class_core.php文件中数据库操作类DB及db_mysql分析
zhuxiaolei87 发表于 2015-6-16 17:43:23 来自PC
人才 一个都看不懂
www.dcl9.com www.guicai.hk
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

快速回复 返回顶部 返回列表