牛骨文教育服务平台(让学习变的简单)
博文笔记

discuz源代码分析

创建时间:2014-03-07 投稿人: 浏览次数:139
第一个文件当然是分析./include/common.inc.php这个文件,这个是Discuz的核心中的核心,基本上每次操作都include到了这个文件,下面就分七段来分析这个文件:

Section One:

QUOTE:

CODE:

//定义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这样的方式得到,有通用性~!

QUOTE:

CODE:

require_once DISCUZ_ROOT."./include/global.func.php";把include/global.inc.php引用进来,这个文件是Discuz的核心函数文件,包含了Discuz用到的很多通用的函数,可以说它就是一个大的通用函数库。

CODE:

define("ISROBOT", getrobot());
if(defined("NOROBOT") && ISROBOT) {
        exit(header("HTTP/1.1 403 Forbidden"));
}
这里是定义一个ISROBOT常量,看看浏览者是什么东东,比方说如果浏览者是一个robot那么就直接来一个 403 Forbidden了……

CODE:

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);
此处是过滤提交的变量用的,提高安全性的用法。。

CODE:

$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中去。在下面一段会有取出的代码。

CODE:

unset($prelength, $_request, $_key, $_value);
$timestamp = time();

if($attackevasive) {
        require_once DISCUZ_ROOT."./include/security.inc.php";
}
这一部分代码是提高安全用的,防一些非法的入侵,include/security.inc.php文件中就是这样一些检查。

CODE:

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地址,浏览器类型等等。

QUOTE:

CODE:

preg_match("/[/d/.]{7,15}/", $onlineip, $onlineipmatches);
$onlineip = $onlineipmatches[0] ? $onlineipmatches[0] : "unknown";
unset($onlineipmatches);
看看ip是不是点分段,7-15个数字之间,用到了一个正则表达式,

CODE:

$cachelost = (@include DISCUZ_ROOT."./forumdata/cache/cache_settings.php") ? "" : "settings";
@extract($_DCACHE["settings"]);
这一段是获得./forumdata/cache/cache_settings.php(即缓存下的设置数组,并展开,方面以后的写法

CODE:

if($gzipcompress && function_exists("ob_gzhandler") && CURSCRIPT != "wap") {
        ob_start("ob_gzhandler");
} else {
        $gzipcompress = 0;
        ob_start();
}
检查gzip是不是打开了,打开就用ob_gzhandler,没有就用ob_start。

CODE:

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了吧?呵呵,平衡负载用的。

CODE:

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这个变量中。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。