zoukankan      html  css  js  c++  java
  • discuz 3.x 核心文件class_core.php解析

    class_core.php是discuz 3.x的核心文件,几乎所有PHP脚本都有引用此文件初始化论坛运行环境。以下解析引用3.2版discuz。

    line 12-15:常量定义
    IN_DISCUZ: true  //用于防止内部PHP引用文件被直接调用。
    DISCUZ_ROOT: E:\project\discuz\    //论坛所在的物理路径
    DISCUZ_CORE_DEBUG: false              //核心代码是否测试模式
    DISCUZ_TABLE_EXTENDABLE: false        //未知

    line 17: 设置自定义异常处理功能
    处理方法位于:core::handleException静态方法。

    line 24-30:定义自动加载类函数 该方法位于:core::autoload($class)

    if(function_exists('spl_autoload_register')) {
        spl_autoload_register(array('core', 'autoload')); //自动加载类函数
    } else {
        function __autoload($class) {
            return core::autoload($class);
        }
    }

    该方法简述:引用./source/class/文件夹下的类文件。方法参数为类名称,类名称如有_下划线,则前缀为子文件夹名称,后缀为文件夹名_类名。 ./source/class/子文件夹/子文件夹名_类 例:$class = "discuz_base",则引用类文件为: ./source/class/discuz/discuz_base.php 所有引用过的文件名都存储在core::imports数组内。

    line 33:执行C::createapp()静态方法.

    C::creatapp();

    该方法为最重要的方法,是初始化论坛的方法,该方法创建discuz_application类对象,使用单一工厂模式。 discuz_application类位于: ./source/class/discuz/discuz_application.php

    C::createapp()方法不直接创建discuz_application类实例,而是通过执行discuz_application::instance()静态方法间接创建。

    discuz_application::instance()静态方法new一个实例,构造函数初始化了论坛环境。(详情请看discuz_application.php解析)。

    另外,该文件结尾用简写重定义了类名: line 208-209: C重定义core类名; DB重定义discuz_database类名。

    discuz_application.php解析:

    该类位于./source/class/discuz/discuz_application.php,被core对象间接实例化。该类有两个最重要的方法,一个是构造函数,一个是init方法。

    构造函数解析:

    line 57-62:构造函数对论坛参数的初始化,分别用4个方法实施:

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

    (1)$this->_init_env():

    初始化环境变量 line 87-93:常量定义 MAGIC_QUOTES_GPC:true(5.4版以上为false) ICONV_ENABLE:true MB_ENABLE:true EXT_OBGZIP:true TIMESTAMP:当前时间截 并设当前时区为格林尼治时区

    line 94: 引用核心函数库:./cource/function/function_core.php。 引用成功并定义常量:DISCUZ_CORE_FUNCTION:true

    line 99-104:设置ini:memory_limit:128M line 106:检测爬虫:IS_ROBOT:false

    line 108-112:清除不必要的全局变量。

            foreach ($GLOBALS as $key => $value) {
                if (!isset($this->superglobal[$key])) {
                    $GLOBALS[$key] = null; unset($GLOBALS[$key]);
                }
            }

    line 114-203:定义全局变量:$_G,对象本身的var属性也保存一份其引用。

    (2)$this->_init_config() 初始化环境:

    line 289: 引用./conifg/config_global.php配置参数文件

    line 299:检测并设定$_config['security']['authkey']的值。

            if(empty($_config['security']['authkey'])) {
                $_config['security']['authkey'] = md5($_config['cookie']['cookiepre'].$_config['db'][1]['dbname']);
            }

    line 303-315: 检测配置参数是否存在debug配置参数,如果没有则 定义常量DISCUZ_DEBUG:false,否则设为true。

    line 316-317:常量定义:STATICURL:static/,则存入var属性。

    line 319-320: 将所有$_config数组参数,存入:$this->config和$this->var['config']。

    line 322: $_config['cookie']['cookiepath']参数值前加/斜线。

    line 325: 重定义$this->var['config']['cookie']['cookiepre']值。

    (3)$this->_init_input()初始化输入

    line 236-240: 如果魔术引号功能开启,则去除$_GET,$_POST,$_COOKIE反斜线;

    line 243-246: 根据$this->config['cookie']['cookiepre']值,将带有此前缀的cookie都存入$this->var['cookie'],key不带前缀。

    line 251-253: POST值合并入GET内; GET值存入$this->var['gp_'.键名]中。

    line 255-257:$_GET['page']url编码。

    line 259-261: 处理掉无效的$_GET['handlekey'],该值只能含有字母数字和下划线。

    line 264-268: 将$_GET值存入$this->var['gp_'.键名]中,所有值做addslashes引用(即引号和作引用)

    line 270-273: 初始化$_GET['mod'],存入$this->var['mod'],mod参数为执行的模块名; 初始化$_GET['inajax'],存入$this->var['inajax'],该值判断请求是否ajax请求; 初始化$_GET['page'],存入$this->var['page']; 初始化$this->var['cookie']['sid'],存入$this->var['sid'],一般情况为空值。

    line 275-278: 如果$this->var['cookie']['saltkey']不存在,则生成该值,并存入cookie,有效期1个月。

    line 279: 根据$this->var['cookie']['saltkey']和$this->var['config']['security']['authkey'],生成$this->var['authkey']值。

    (4)$this->_init_output() 初始化输出:

    line 337-342:判断网页是否启用gzip压缩,设定$this->config['output']['gzip']布尔值;并决定设定$_G['gzipcompress']的布尔值。

            if(!empty($_SERVER['HTTP_ACCEPT_ENCODING']) && strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') === false) {
                $this->config['output']['gzip'] = false;
            }
    
            $allowgzip = $this->config['output']['gzip'] && empty($this->var['inajax']) && $this->var['mod'] != 'attachment' && EXT_OBGZIP;
            setglobal('gzipcompress', $allowgzip);

    line 344-346: 开启输出缓存。

        if(!ob_start($allowgzip ? 'ob_gzhandler' : null)) {
                ob_start();
            }

    line 348-353: 设定$_G['charset']和常量CHARSET的字符编码值,取值于$this->config['output']['charset']。 将字符编码输出于网页头部。

            setglobal('charset', $this->config['output']['charset']);
            define('CHARSET', $this->config['output']['charset']);
            //默认输出字符编码标识
            if($this->config['output']['forceheader']) {
                @header('Content-Type: text/html; charset='.CHARSET);
            }

    discuz_application::init()方法解析:

     该方法也主要初始化论坛环境,准备好相关的数据库连接类、设置、用户、会话等等相关参数。

    (1)$this->init_db():

        private function _init_db() {
            if($this->init_db) {
                $driver = function_exists('mysql_connect') ? 'db_driver_mysql' : 'db_driver_mysqli';
                if(getglobal('config/db/slave')) {
                    $driver = function_exists('mysql_connect') ? 'db_driver_mysql_slave' : 'db_driver_mysqli_slave';
                }
                DB::init($driver, $this->config['db']);
            }
        }

     DB类位于./source/class/discuz_database.php,实际上就是discuz_database类。DB::init()根据参数配置实例化mysql连接类。

    (2)

  • 相关阅读:
    贝叶斯网路的采样
    马尔可夫蒙特卡洛采样法
    高斯分布的采样
    常见的采样方法
    正则化
    随机梯度下降
    机器学习中的优化问题
    【原】涉及数据库的单元测试-JTeser
    高度和宽度
    定位position
  • 原文地址:https://www.cnblogs.com/xiwang6428/p/5801359.html
Copyright © 2011-2022 走看看