日期:2014-05-17  浏览次数:20488 次

[zz]discuzX1核心文件class_core.php分析
/*Discuz!X 核心文件class_core.php分析
2010-08-24 10:20
在研究DISCUZ!X核心文件class_core.php时作的DISCUZ!X产品相较之前版本的底层机制上的变化分析及源码部分注释。
___________________________________________
我今天花了1个多小时,阅读了下class_core.php,DB数据库和cron任务计划没看。总体感觉,比起dz72来说,各项机制和体系都有所增强,变化相当大。
【1】最明显的一点是,核心体系基本都用类进行封装了,架构清晰,使用起来相对简易,基本的架构类似Ucenter,但略有增强。
【2】安全机制进一步加强,特别是GLOBALS超级全局变量的注销,及各变量的初始化,让人印象深刻。
【3】原来的GPC和session机制,大体变化不算很大,但进行了一些优化和增强,考虑得更全面了。不过新版清晰与普通变量进行了区隔,如get、 post用 gp_,而cookie用$cookie数组,而session用$session。
【4】功能上,基本上原有的客户端ip、机器人判断、转义、gzhandler、对xss跨站攻击的基本防御、缓存丢失判断等基本上差别不算太大。
【5】增加了memory内存读写引擎,支持memcache、xcache,eAccelerator。
【6】在原有session机制处理逻辑基础上,精简了一部分实现,重新自定义并增强了SESSION机制,代码的写法与结构与memory写法类似。但具体效果有待验证。
附随笔作的注释大家将就看吧
*/
<?php

/**
 *      [Discuz!] (C)2001-2099 Comsenz Inc.
 *      This is NOT a freeware, use is subject to license terms
 *
 *      $Id: class_core.php 6914 2010-03-26 12:52:36Z cnteacher $
 */

///TODO 是将要完成的功能,包括禁止ip和禁止访问
//TODO 禁止ip
//TODO 禁止访问

///和DZ72一样,确保所有文件需要先加载核心文件
define('IN_DISCUZ', true);

/**
 * Discuz 核心引擎
 * 其他处理代码当中用到的变量不要在本核心 new 之前设置, 否则会自动清空
 *
 */
class discuz_core {

    // 数据库存储引擎
    var $db = null;

    // 内存缓冲object
    var $mem = null;

    // 会话 object
    var $session = null;

    // 程序配置
    var $config = array();

    // $_G 数组的映射
    var $var = array();

    // 加载缓存的数组
    var $cachelist = array();

    // 是否初始化
    var $init_setting = true; //设置
    var $init_user = true;//用户
    var $init_session = true;//会话
    var $init_cron = true;//任务计划
    var $init_misc = true;//其他功能
    var $init_memory = true;//内存

    // 是否已经初始化
    var $initated = false;

    var $superglobal = array(
        'GLOBALS' => 1,
        '_GET' = 1,
        '_POST' = 1,
        '_REQUEST' = 1,
        '_COOKIE' = 1,
        '_SERVER' = 1,
        '_ENV' = 1,
        '_FILES' = 1,
    );

    function &instance() {
        static $object;
        if(empty($object)) {
            $object = new discuz_core();
        }
        return $object;
    }

    function discuz_core() {
        $this->_init_env();
        $this->_init_config();
        $this->_init_input();
        $this->_init_output();
    }

    function init() {
        if(!$this->initated) {
            $this->_init_db();
            $this->_init_memory();
            $this->_init_user();
            $this->_init_session();
            $this->_init_setting();
            $this->_init_cron();
            $this->_init_misc();
        }
        $this->initated = true;
    }

    function _init_env() {

        error_reporting(E_ALL ^ E_NOTICE);
//        error_reporting(E_ALL);
        ///php 5.3前则关闭魔法引号匹配(自动转义)
        if(phpversion() < '5.3.0') {
            set_magic_quotes_runtime(0);
        }

        ///程序主目录,根据核心文件确定,原来是-7 代表在include下,现在是12代表在source/class下
        define('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -12));
        ///和dz72一样,设置魔法引用(自动转义,单双引号反斜线)
        define('MAGIC_QUOTES_GPC', function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc());
        ///判断字符编码转换函数是否存在
        define('ICONV_ENABLE', function_exists('iconv'));
        ///亚洲字符转码函数是否存在, 因为mb_开头字符处理亚洲字符会比较高效,初步判断用于转码时先用mb_来处理:
        define('MB_ENABLE', function_exists('mb_convert_encoding'));
        ///是否存在输出缓存压缩函数,这个函数的目的,是在确认浏览器支持页面压缩后,才用该函数来压缩所有输出内容,否则直接传输
        define('EXT_OBGZIP', function_exists('ob_gzhandler'));

        ///和DZ72一样,不过当前时间戳被定义为一个常量,效率更高吧,也不用global了。
        define('TIMESTAMP', time());
        ///获取默认时区
        discuz_core::timezone_set();

        ///加载function_core.php,作用推测类似global.func.php
        if(!defined('DISCUZ_CORE_FUNCTION') && !@include(DISCUZ_ROOT.'./source/function/function_core.php')) {
            $this->error('function_core.php is missing');
        }

        //判断浏览器是否是蜘蛛