`

Discuz!源代码分析系列(1)-./include/common.inc.php

阅读更多
本楼文章转自www.discuz.net 作者:郭鑫
第一个文件当然是分析./include/common.inc.php这个文件,这个是Discuz的核心中的核心,基本上每次操作都include到了这个文件,下面就分七段来分析这个文件:

Section One:
复制内容到剪贴板
代码:
//定义PHP一些环境
error_reporting(0);
set_magic_quotes_runtime(0);

//设置Discuz开始的时间
$mtime = explode(' ', microtime());
$discuz_starttime = $mtime[1] + $mtime[0];

//定义一些常量
define('SYS_DEBUG', FALSE);
define('IN_DISCUZ', TRUE);
define('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -7)); //获得绝对目录

//通用性
if(PHP_VERSION < '4.1.0') {
        $_GET = &$HTTP_GET_VARS;
        $_POST = &$HTTP_POST_VARS;
        $_COOKIE = &$HTTP_COOKIE_VARS;
        $_SERVER = &$HTTP_SERVER_VARS;
        $_ENV = &$HTTP_ENV_VARS;
        $_FILES = &$HTTP_POST_FILES;
}
这一段基本上就是设置一下错误报告,把magic_quotes这个sick家伙给关了,然后定一个开始的时间,这样我们在论坛底部看到的Process Time就是通过这个开始的时间和一个结束的时间的差来计算的,然后定义一个IN_DISCUZ为真,这个IN_DISCUZ常量的作用就是在其他inc 这样的包含文件中防止被非法引用,一旦没有这个常量的话就出现Access Denied这样的字样然后退出。然后获得Discuz运行的绝对目录。接下来是判断PHP 的版本是4.1 以下还是以上,因为PHP以4.1为一个分界线,在4.1以下以$HTTP_GET_VARS[‘xx’]这样的方式来得到get过来的值,而以后用$ _GET来得到get过来的值,这样做的目的是为了无论是什么样的PHP版本,都能用$_GET这样的方式得到,有通用性~!

Section Two:
复制内容到剪贴板
代码:
require_once DISCUZ_ROOT.'./include/global.func.php';
把include/global.inc.php引用进来,这个文件是Discuz的核心函数文件,包含了Discuz用到的很多通用的函数,可以说它就是一个大的通用函数库。
复制内容到剪贴板
代码:
define('ISROBOT', getrobot());
if(defined('NOROBOT') && ISROBOT) {
        exit(header("HTTP/1.1 403 Forbidden"));
}
这里是定义一个ISROBOT常量,看看浏览者是什么东东,比方说如果浏览者是一个robot那么就直接来一个 403 Forbidden,具体可以参考http://www.niushou.com/bbs/thread-8900-1-1.html第三楼关于isrobot地说明
复制内容到剪贴板
代码:
define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
isset($_REQUEST['GLOBALS']) && exit('Access Error');
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
        foreach($_request as $_key => $_value) {
                $_key{0} != '_' && $_key = daddslashes($_value);
        }
}
(!MAGIC_QUOTES_GPC) && $_FILES = daddslashes($_FILES);
此处是过滤提交的变量用的,提高安全性的用法。。
复制内容到剪贴板
代码:
$charset = $dbcharset = $forumfounders = $metakeywords = $extrahead = '';
$plugins = $hooks = $admincp = array();

require_once DISCUZ_ROOT.'./config.inc.php';

$_DCOOKIE = $_DSESSION = $_DCACHE = $_DPLUGIN = $advlist = array();

$prelength = strlen($cookiepre);
foreach($_COOKIE as $key => $val) {
        if(substr($key, 0, $prelength) == $cookiepre) {
                $_DCOOKIE[(substr($key, $prelength))] = MAGIC_QUOTES_GPC ? $val : daddslashes($val);
        }
}
初始化一些变量,然后引用config.inc.php这个配置文件,这样开始初始化程序的一些东西了。接下来的一个循环把$_COOKIE中的东西取出来存到$_DCOOKIE这个数组中。注意:在登陆的时候Discuz会把登陆信息存放到$_COOKIE中去。在下面一段会有取出的代码。
复制内容到剪贴板
代码:
unset($prelength, $_request, $_key, $_value);
$timestamp = time();

if($attackevasive) {
        require_once DISCUZ_ROOT.'./include/security.inc.php';
}
这一部分代码是提高安全用的,防一些非法的入侵,include/security.inc.php文件中就是这样一些检查。
复制内容到剪贴板
代码:
require_once DISCUZ_ROOT.'./include/db_'.$database.'.class.php';


$PHP_SELF = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
$SCRIPT_FILENAME = str_replace('\\\\', '/', (isset($_SERVER['PATH_TRANSLATED']) ? $_SERVER['PATH_TRANSLATED'] : $_SERVER['SCRIPT_FILENAME']));
$boardurl = 'http://'.$_SERVER['HTTP_HOST'].preg_replace("/\/+(api|archiver|wap)?\/*$/i", '', substr($PHP_SELF, 0, strrpos($PHP_SELF, '/'))).'/';

if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
        $onlineip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
        $onlineip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
        $onlineip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
        $onlineip = $_SERVER['REMOTE_ADDR'];
}
第一行是把include/db_mysql.class.php引用进来,这个文件是一个数据库的类。我觉得是不是放在这里太早了点?
然后接下的作用就是得到自身的名称$PHP_SELF,自身的文件名字$SCRIPT_FILENAME,论坛的地址$boardurl,得到浏览者的一些信息,比方说ip地址,浏览器类型等等。

Section Three:
复制内容到剪贴板
代码:
preg_match("/[\d\.]{7,15}/", $onlineip, $onlineipmatches);
    $onlineip = $onlineipmatches[0] ? $onlineipmatches[0] : 'unknown';
    unset($onlineipmatches);
看看ip是不是点分段,7-15个数字之间,用到了一个正则表达式
复制内容到剪贴板
代码:
$cachelost = (@include DISCUZ_ROOT.'./forumdata/cache/cache_settings.php') ? '' : 'settings';
    @extract($_DCACHE['settings']);
这一段是获得./forumdata/cache/cache_settings.php(即缓存下的设置数组,并展开,方面以后的写法
复制内容到剪贴板
代码:
if($gzipcompress && function_exists('ob_gzhandler') && CURSCRIPT != 'wap') {
            ob_start('ob_gzhandler');
    } else {
            $gzipcompress = 0;
            ob_start();
    }
检查gzip是不是打开了,打开就用ob_gzhandler,没有就用ob_start。
复制内容到剪贴板
代码:
if(!empty($loadctrl) && substr(PHP_OS, 0, 3) != 'WIN') {
            if($fp = @fopen('/proc/loadavg', 'r')) {
                    list($loadaverage) = explode(' ', fread($fp, 6));
                    fclose($fp);
                    if($loadaverage > $loadctrl) {
                            header("HTTP/1.0 503 Service Unavailable");
                            include DISCUZ_ROOT.'./include/serverbusy.htm';
                            exit();
                    }
            }
    }
看到了熟悉的service unavailable了吧?呵呵,平衡负载用的。
复制内容到剪贴板
代码:
if(defined('CURSCRIPT') && in_array(CURSCRIPT, array('index', 'forumdisplay', 'viewthread', 'post', 'blog', 'pm', 'topicadmin', 'register', 'archiver'))) {
            $cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/cache_'.CURSCRIPT.'.php') ? '' : ' '.CURSCRIPT;
    }
   
看看是不是index, forumdisplay, viewthread这些文件是不是缓存了,有的话把它装到$cachelost这个变量中。
分享到:
评论

相关推荐

    discuz代码分析--common.inc篇

    通过对`common.inc.php`的深入分析,我们可以更好地理解Discuz!的工作原理,这对于定制开发、性能优化、安全防护等方面都具有指导意义。同时,这也为我们提供了一个优秀的框架设计参考,学习如何构建一个高效、可...

    游客不能浏览帖子里的链接插件for Discuz!7.1/ 7.2 GBK UTF8.rar

    游客不能浏览帖子里的链接插件理论上支持很多版本。7.1和7.2亲测过没有问题。 其他版本的,只要找到..../include/discuzcode.func.php ./templates/default/discuzcode.htm ./templates/default/templates.lang.php

    DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案

    当我们在Windows Server 2003环境下搭建Discuz论坛时,可能会遇到“Unable to access ./include/common.inc.php”的错误,该问题通常与服务器权限设置或PHP配置不当有关。以下知识点将详细介绍该问题的排查方法和...

    Discuz! X1 繁体中文 UTF-8.zip

    1、Discuz!X Beta升级到正式版 将正式版压缩包upload目录下的程序上传并覆盖旧程序,将utility目录下的update.php上传到根目录install目录下运行,按照提示完成升级。 注意:升级完成务必删除update.php文件 详见...

    百度新闻插件 for Discuz! x1.5~2-源码.zip

    1. **Discuz!**:Discuz! 是一个强大的PHP论坛系统,它采用MySQL数据库,支持多语言和多种服务器环境。其核心特点包括模板分离、插件机制和API接口,使得扩展性和可定制性极强。 2. **插件系统**:Discuz! 的插件...

    论坛社区全文检索 For Discuz! 6.0.0-search-discuz!.zip

    源代码可能包括配置文件、索引生成脚本、查询处理类以及与Discuz! 接口交互的模块。 2. **安装与配置指南**:为了使这个插件能够顺利地在Discuz! 论坛上运行,通常会提供详细的安装步骤和配置说明。这包括如何将源...

    Discuz!NT-3.6.711-繁体

    【标题】"Discuz!NT-3.6.711-繁体"指的是Discuz!NT的一个特定版本,这是由Comsenz公司开发的一款基于ASP.NET技术的论坛软件。 Discuz!NT是针对Windows服务器环境设计的,它提供了一个功能丰富的社区论坛平台,支持多...

    DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in… 的问题终极解决方案

    这两天论坛经常报错误信息 Warning: require_once(./include/common.inc.php) [function.require- once]: failed to open stream: No such file or directory in E:\host\aydsw\index.php on line 12 Fatal error: ...

    [论坛社区]Discuz!论坛系统 7.0.0 简体UTF-8 独立安装包 .rar

    后台框架代码:java/c/c++/php/VB/lun/Andorid/Python 开发环境:idea 数据库:MySql(建议用 5.7,8.0 有时候会有坑) 部署环境:Tomcat(建议用 7.x 或者 8.x b版本),maven Spring root vue.js

    discuz搭建

    ### Discuz! 搭建详解 #### 一、系统要求与环境配置 **Discuz!7.0.0系统**是由Comsenz公司开发的一款知名的论坛系统,它基于PHP和MySQL运行,提供了丰富的功能和良好的用户体验。在搭建Discuz!前,确保服务器满足...

    DISCUZ!7.0 common.inc.php 带注释(!!不下不要后悔哦!)

    DISCUZ!7.0 common.inc.php 带注释(!!不下不要后悔哦!)

    iMule资源下载系统插件for Discuz!7.0 v1.0.1.rar

    iMule资源下载系统 v1.0.1插件for Discuz!7.0 一、请按结构上传到论坛目录 具体如下: 论坛目录 --------/imule.php --------/templates -----------------/default ------------------------/imule.htm ---...

    ASP.NET-[论坛社区]Discuz!NT2.6安装包繁体utf-8.web.zip

    在本场景中,我们讨论的是一个针对论坛社区的解决方案——Discuz!NT的2.6版本。 Discuz!NT是一款基于ASP.NET平台的开源社区软件,它由Comsenz公司开发,主要服务于需要搭建在线讨论区、论坛或社交网络的用户。...

    Discuz! X2 首页N格 2012-源码.zip

    1. **模板系统**:Discuz! X2 使用了其特有的模板引擎,学习源码可以理解如何创建和修改模板,以及如何控制页面布局和样式。 2. **模块化设计**:首页N格的概念意味着源码中会包含多个独立但相互协作的模块,这涉及...

    HTML &lt;!--...--&gt; 注释标签的深层次作用分析

    --...--&gt;`注释标签是一种非常重要的工具,特别是在网页开发中,它使得代码更具可读性和可维护性。下面将详细分析其深层次作用。 首先,HTML注释的基本功能是提供对代码的解释,方便其他开发者理解代码的意图。在...

    PHP实例开发源码-Discuz!网银在线插件 php版 X3.zip

    PHP实例开发源码—Discuz!网银在线插件 php版 X3.zip PHP实例开发源码—Discuz!网银在线插件 php版 X3.zip PHP实例开发源码—Discuz!网银在线插件 php版 X3.zip

    DISCUZ!-ZHUOBUFAN.COM 2000会员.txt

    ### 文件标题:DISCUZ!-ZHUOBUFAN.COM 2000会员.txt 该标题揭示了文件的主要内容是关于“ZHUOBUFAN.COM”网站上的Discuz!论坛的2000名会员的信息。 ### 文件描述:DISCUZ!-ZHUOBUFAN.COM 2000会员.txt 文件描述与...

    Discuz_X3.2_SC_GBK.zip

    Discuz! X 社区软件系统简介 +----------------------------------+ Crossday Discuz! Board(以下简称 Discuz!,中国国家版权局著作权登记号 2008SR11708 )是康盛创想(北京)科技有限公司(英文简称Comsenz)推出...

    PHP实例开发源码-Discuz! X3.4 繁体中文 UTF8.zip

    PHP实例开发源码—Discuz! X3.4 繁体中文 UTF8.zip PHP实例开发源码—Discuz! X3.4 繁体中文 UTF8.zip PHP实例开发源码—Discuz! X3.4 繁体中文 UTF8.zip

Global site tag (gtag.js) - Google Analytics