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這個變量中。

Section Four:
複製內容到剪貼板
代碼:
$db = new dbstuff;
    $db->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect);
    $dbhost = $dbuser = $dbpw = $dbname = $pconnect = NULL;
好了,這裏是初始化一個dbstull類的實例,也就是說前面的include/db_mysql.class.php在這裏用上了,因此我以爲那個 require_once早了點,放到這裏的前面最合適了~!J下面就是連上mysql了,而後把幾個配置的變量NULL掉,安全性考慮得真多,武裝到牙 齒!
複製內容到剪貼板
代碼:
$sid = daddslashes(($transsidstatus || (defined('CURSCRIPT') && CURSCRIPT == 'wap'))&& (isset($_GET['sid']) || isset($_POST['sid'])) ?
            (isset($_GET['sid']) ? $_GET['sid'] : $_POST['sid']) :
            (isset($_DCOOKIE['sid']) ? $_DCOOKIE['sid'] : ''));
看看是否是後臺設置了經過sid傳輸的那個東東,還有是否是經過wap訪問的,還有是否是有sid這個東東在$_GET或$_POST這兩個的任何一箇中,以上結論都成立的話從GET中得到sid,不成立的話從$_DCOOKIE中得到。
複製內容到剪貼板
代碼:
$discuz_auth_key = md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT']);
設置一個$discuz_auth_key,md5加密。。
複製內容到剪貼板
代碼:
if(isset($_DCOOKIE['auth']) && $_DCOOKIE['auth']) {
            list($discuz_pw, $discuz_secques, $discuz_uid) = daddslashes(explode("\t", authcode($_DCOOKIE['auth'], 'DECODE')), 1);
            if(!is_numeric($discuz_uid) || !$discuz_uid) {
                    clearcookies();
            }
    } else {
            list($discuz_pw, $discuz_secques, $discuz_uid) = array('', '', 0);
    }
這一段是用來檢查是否是$_DCOOKIE[‘auth’]存在,若是有的話就把其中存放的東西分別給$discuz_pw, $discuz_secques, $discuz_uid這三個變量,分別對應密碼,提示問題和uid。

Section Five:
複製內容到剪貼板
代碼:
$newpm = $newpmexists = $sessionexists = $seccode = $bloguid = 0;//初始化變量

    $membertablefields = 'm.uid AS discuz_uid, m.username AS discuz_user, m.password AS discuz_pw, m.secques AS discuz_secques,
            m.adminid, m.groupid, m.groupexpiry, m.extgroupids, m.email, m.timeoffset, m.tpp, m.ppp, m.posts, m.digestposts,
            m.oltime, m.pageviews, m.credits, m.extcredits1, m.extcredits2, m.extcredits3, m.extcredits4, m.extcredits5,
            m.extcredits6, m.extcredits7, m.extcredits8, m.timeformat, m.dateformat, m.pmsound, m.sigstatus, m.invisible,
            m.lastvisit, m.lastactivity, m.lastpost, m.newpm, m.accessmasks, m.xspacestatus, m.editormode, m.customshow';
    if($sid) {
            if($discuz_uid) {
                    $query = $db->query("SELECT s.sid, s.styleid, s.groupid='6' AS ipbanned, s.pageviews AS spageviews, s.lastolupdate, s.seccode, $membertablefields
                            FROM {$tablepre}sessions s, {$tablepre}members m
                            WHERE m.uid=s.uid AND s.sid='$sid' AND CONCAT_WS('.',s.ip1,s.ip2,s.ip3,s.ip4)='$onlineip' AND m.uid='$discuz_uid'
                            AND m.password='$discuz_pw' AND m.secques='$discuz_secques'");
            } else {
                    $query = $db->query("SELECT sid, uid AS sessionuid, groupid, groupid='6' AS ipbanned, pageviews AS spageviews, styleid, lastolupdate, seccode
                            FROM {$tablepre}sessions WHERE sid='$sid' AND CONCAT_WS('.',ip1,ip2,ip3,ip4)='$onlineip'");
            }
            if($_DSESSION = $db->fetch_array($query)) {
                    $sessionexists = 1;
                    if(!empty($_DSESSION['sessionuid'])) {
                            $query = $db->query("SELECT $membertablefields
                                    FROM {$tablepre}members m WHERE uid='$_DSESSION[sessionuid]'");
                            $_DSESSION = array_merge($_DSESSION, $db->fetch_array($query));
                    }
            } else {
                    $query = $db->query("SELECT sid, groupid, groupid='6' AS ipbanned, pageviews AS spageviews, styleid, lastolupdate, seccode
                            FROM {$tablepre}sessions WHERE sid='$sid' AND CONCAT_WS('.',ip1,ip2,ip3,ip4)='$onlineip'");
                    if($_DSESSION = $db->fetch_array($query)) {
                            clearcookies();
                            $sessionexists = 1;
                    }
            }
    }
這一段是有蠻長的,不過看着長不表明它就難,第一行是初始化變量用的(不管什麼時候用變量都要考慮初始化,要否則安全性不值得一提,一個get就完了)
    接下來是判斷是否是有sid,有的話就從cdb_session表中取來,而後鏈接一下cdb_members表取出一些更具體的東西,具體是哪些東西? 在$membertablefields這個變量裏面已經全面寫出來了,對應數據庫看吧,不看的話用英語猜猜得出的。。。在這裏Discuz標記了一個 sessionexist變量,表示這個會員是在線的。
複製內容到剪貼板
代碼:
  if(!$sessionexists) {
            if($discuz_uid) {
                    $query = $db->query("SELECT $membertablefields
                            FROM {$tablepre}members m WHERE m.uid='$discuz_uid' AND m.password='$discuz_pw' AND m.secques='$discuz_secques'");
                    if(!($_DSESSION = $db->fetch_array($query))) {
                            clearcookies();
                    }
            }
要是不存在sid,不存在discuz_uid,那就確定沒有登錄了,清掉cookie,要是有$discuz_uid的話,仍是從members表中取出信息存放到$_DSESSION數組中
複製內容到剪貼板
代碼:
  if(ipbanned($onlineip)) $_DSESSION['ipbanned'] = 1;

            $_DSESSION['sid'] = random(6);
            $_DSESSION['seccode'] = random(6, 1);
    }
    $_DSESSION['dateformat'] = empty($_DSESSION['dateformat']) ? $_DCACHE['settings']['dateformat'] : $_DSESSION['dateformat'];
    $_DSESSION['timeformat'] = empty($_DSESSION['timeformat']) ? $_DCACHE['settings']['timeformat'] : ($_DSESSION['timeformat'] == 1 ? 'h:i A' : 'H:i');
    $_DSESSION['timeoffset'] = isset($_DSESSION['timeoffset']) && $_DSESSION['timeoffset'] != 9999 ? $_DSESSION['timeoffset'] : $_DCACHE['settings']['timeoffset'];
這個是判斷ip是否是在被阻止的list裏,是的話就標記一下,用$_DSESSION[‘ipbanned’]標記的。再把一個隨機的sid和seccode寫到$_DSESSION數組。而後接下來是把日期,時間,時差寫入$_DSESSION這個變量。
複製內容到剪貼板
代碼:
$membertablefields = '';
    @extract($_DSESSION);

    $lastvisit = empty($lastvisit) ? $timestamp - 86400 : $lastvisit;
    $timenow = array('time' => gmdate("$dateformat $timeformat", $timestamp + 3600 * $timeoffset),
            'offset' => ($timeoffset >= 0 ? ($timeoffset == 0 ? '' : '+'.$timeoffset) : $timeoffset));

    if(PHP_VERSION > '5.1') {
            @date_default_timezone_set('Etc/GMT'.($timeoffset > 0 ? '-' : '+').(abs($timeoffset)));
    }
又見變量初始化,而後是把$_DESSION給展開,這樣方便多了。接下來判斷是否是有上次訪問的時間,有的話就沒事,沒有的話就減去24小時。
    接下來給一個如今的時間,這裏有一個時間的問題,因此把時間加上時差乘上3600秒就獲得當前時間了。
    PHP 5 能處理時差了,因此Discuz在這裏也設置了一下,想得真全面!!

Section Six:
複製內容到剪貼板
代碼:
$accessadd1 = $accessadd2 = $modadd1 = $modadd2 = '';
    if(empty($discuz_uid) || empty($discuz_user)) {
            $discuz_user = $extgroupids = '';
            $discuz_uid = $adminid = $posts = $digestposts = $pageviews = $oltime = $invisible
                    = $credits = $extcredits1 = $extcredits2 = $extcredits3 = $extcredits4
                    = $extcredits5 = $extcredits6 = $extcredits7 = $extcredits8 = 0;
            $groupid = empty($groupid) || $groupid != 6 ? 7 : 6;

    } else {
            $discuz_userss = $discuz_user;
            $discuz_user = addslashes($discuz_user);

            if($accessmasks) {
                    $accessadd1 = ', a.allowview, a.allowpost, a.allowreply, a.allowgetattach, a.allowpostattach';
                    $accessadd2 = "LEFT JOIN {$tablepre}access a ON a.uid='$discuz_uid' AND a.fid=f.fid";
            }

            if($adminid == 3) {
                    $modadd1 = ', m.uid AS ismoderator';
                    $modadd2 = "LEFT JOIN {$tablepre}moderators m ON m.uid='$discuz_uid' AND m.fid=f.fid";
            }
    }

    if($errorreport == 2 || ($errorreport == 1 && $adminid > 0)) {
            error_reporting(E_ERROR | E_WARNING | E_PARSE);
    }
首先初始化變量,而後看看$discuz_user$和$discuz_user這兩個變量是否是存在,不存在的話一系列的變量所有置0(沒登錄固然不存 在版主權限管理員什麼的),存在的話就來兩個賦值,這就是爲何在Discuz UserGuide裏面說$discuz_userss是沒有過濾的,而$discuz_user是過濾掉的,能直接進行數據庫操做的。
    而後看看怎麼樣設置PHP 的出錯級別,注意若是你的管理員的話,Discuz給的是一個更高的錯誤顯示級別!
複製內容到剪貼板
代碼:
define('FORMHASH', formhash());

    $statstatus && require_once DISCUZ_ROOT.'./include/counter.inc.php';

    $extra = isset($extra) && @preg_match("/^[&=;a-z0-9]+$/i", $extra) ? $extra : '';
    $tpp = intval(empty($_DSESSION['tpp']) ? $topicperpage : $_DSESSION['tpp']);
    $ppp = intval(empty($_DSESSION['ppp']) ? $postperpage : $_DSESSION['ppp']);
這一段定義一個form hash,這個是經過global.func.php這個文件中的formhash()函數來的。而後看是否是要等到統計信息,要的話就引用./include/counter.inc.php這個文件,不要的話固然就不引用了。
引用:
$extra這個東東不知道作嘛用的。。。。
    $tpp-threads per page每頁的帖子數
    $ppp-posts per page每頁的回覆數
複製內容到剪貼板
代碼:
$rsshead = $navtitle = $navigation = '';


    $_DSESSION['groupid'] = $groupid = empty($ipbanned) ? (empty($groupid) ? 7 : intval($groupid)) : 6;
    if(!@include DISCUZ_ROOT.'./forumdata/cache/usergroup_'.$groupid.'.php') {
            $query = $db->query("SELECT type FROM {$tablepre}usergroups WHERE groupid='$groupid'");
            $grouptype = $db->result($query, 0);
            if(!empty($grouptype)) {
                    $cachelost .= ' usergroup_'.$groupid;
            } else {
                    $grouptype = 'member';
            }
    }
用來獲得用戶組的,首先看看是否是緩存中有,沒有的話就訪問數據庫了,有的話固然就用緩存的。。
複製內容到剪貼板
代碼:
if($passport_status && ($passport_status != 'shopex' || !$passport_shopex)) {
            $passport_forward = rawurlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
            $link_login = $passport_url.$passport_login_url.(strpos($passport_login_url, '?') === FALSE ? '?' : '&').'forward='.$passport_forward;
            $link_logout = $passport_url.$passport_logout_url.(strpos($passport_logout_url, '?') === FALSE ? '?' : '&').'forward='.$passport_forward;
            $link_register = $passport_url.$passport_register_url.(strpos($passport_register_url, '?') === FALSE ? '?' : '&').'forward='.$passport_forward;
    } else {
            $link_login = 'logging.php?action=login';
            $link_logout = 'logging.php?action=logout&formhash='.FORMHASH;
            $link_register = 'register.php';
    }
Discuz通行證用的。主要就是獲得一些應用程序的地址。
複製內容到剪貼板
代碼:
if($discuz_uid && $_DSESSION) {
            if(!empty($groupexpiry) && $groupexpiry < $timestamp && (!defined('CURSCRIPT') || (CURSCRIPT != 'wap' && CURSCRIPT != 'member'))) {
                    dheader("Location: {$boardurl}member.php?action=groupexpiry");
            } elseif($grouptype && $groupid != getgroupid($discuz_uid, array
                    (
                    'type' => $grouptype,
                    'creditshigher' => $groupcreditshigher,
                    'creditslower' => $groupcreditslower
                    ), $_DSESSION)) {
                    @extract($_DSESSION);
                    $cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/usergroup_'.intval($groupid).'.php') ? '' : ' usergroup_'.$groupid;
            }
    }
這一段用來判斷你的用戶組是否是過時了的,若是過時了很不幸,就被告知用戶組過時了。接下來若是沒有過時的話就再展開一下$_DSESSION,由於此時的$_DSESSION包含了更多的東西了。

Section Seven:
複製內容到剪貼板
代碼:
if(!in_array($adminid, array(1, 2, 3))) {
            $alloweditpost = $alloweditpoll = $allowstickthread = $allowmodpost = $allowdelpost = $allowmassprune
                    = $allowrefund = $allowcensorword = $allowviewip = $allowbanip = $allowedituser = $allowmoduser
                    = $allowbanuser = $allowpostannounce = $allowviewlog = $disablepostctrl = $supe_allowpushthread = 0;
    } elseif(isset($radminid) && $adminid != $radminid && $adminid != $groupid) {
            $cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/admingroup_'.intval($adminid).'.php') ? '' : ' admingroup_'.$groupid;
    }
這裏是權限判斷,若是你不是admin, moderator, super moderator,那麼你的什麼權限都沒。。。
複製內容到剪貼板
代碼:
$forum = array();
    $auditstatuson = !empty($mod) && $mod == 'edit' && in_array($adminid, array(1, 2, 3)) && $allowmodpost ? true : false;

    $tid = isset($tid) && is_numeric($tid) ? $tid : 0;
    $fid = isset($fid) && is_numeric($fid) ? $fid : 0;
    $typeid = isset($typeid) ? intval($typeid) : 0;

    if(!empty($tid) || !empty($fid)) {
            if(empty($tid)) {
                    $query = $db->query("SELECT f.fid, f.*, ff.* $accessadd1 $modadd1, f.fid AS fid
                            FROM {$tablepre}forums f
                            LEFT JOIN {$tablepre}forumfields ff ON ff.fid=f.fid $accessadd2 $modadd2
                            WHERE f.fid='$fid'");
                    $forum = $db->fetch_array($query);
            } else {
                    $query = $db->query("SELECT t.tid, t.closed,".(defined('SQL_ADD_THREAD') ? SQL_ADD_THREAD : '')." f.*, ff.* $accessadd1 $modadd1, f.fid AS fid
                            FROM {$tablepre}threads t
                            INNER JOIN {$tablepre}forums f ON f.fid=t.fid
                            LEFT JOIN {$tablepre}forumfields ff ON ff.fid=f.fid $accessadd2 $modadd2
                            WHERE t.tid='$tid'".($auditstatuson ? '' : " AND t.displayorder>='0'")." LIMIT 1");
                    $forum = $db->fetch_array($query);
                    $tid = $forum['tid'];
            }

            if($forum) {
                    $fid = $forum['fid'];
                    $forum['ismoderator'] = !empty($forum['ismoderator']) || $adminid == 1 || $adminid == 2 ? 1 : 0;
                    foreach(array('postcredits', 'replycredits', 'threadtypes', 'digestcredits', 'postattachcredits', 'getattachcredits', 'supe_pushsetting') as $key) {
                            $forum[$key] = !empty($forum[$key]) ? unserialize($forum[$key]) : array();
                    }
            } else {
                    $fid = 0;
            }
    }
獲得論壇信息用的,若是你是看forumdisplay頁面和看viewthread在數據庫中執行的東東不是同樣的。這樣能獲得一點性能上的提高。而後往forum這個數組裏面寫一些東西進去,比方說:發帖子獲得的分數,回覆獲得的分數,帖子分類的類型等…
複製內容到剪貼板
代碼:
$styleid = intval(!empty($_GET['styleid']) ? $_GET['styleid'] :
                    (!empty($_POST['styleid']) ? $_POST['styleid'] :
                    (!empty($_DSESSION['styleid']) ? $_DSESSION['styleid'] :
                    $_DCACHE['settings']['styleid'])));

    $styleid = intval(isset($stylejump[$styleid]) ? $styleid : $_DCACHE['settings']['styleid']);

    if(@!include DISCUZ_ROOT.'./forumdata/cache/style_'.intval(!empty($forum['styleid']) ? $forum['styleid'] : $styleid).'.php') {
            $cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/style_'.($styleid = $_DCACHE['settings']['styleid']).'.php') ? '' : ' style_'.$styleid;
    }
這裏是獲得論壇風格的地方,能夠看到第一行的賦值Disuz用盡一切可能獲得一個合理的風格styleid,呵呵,而後再來一行,看看是否是你在論壇底部切換了一下風格,有的話就override一下,把這個風格做爲你的當前風格。
    若是沒有緩存的話,再往cachelost這個裏面寫點東西。
複製內容到剪貼板
代碼:
if($cachelost) {
            require_once DISCUZ_ROOT.'./include/cache.func.php';
            updatecache();
            dexit('Cache List: '.$cachelost.'<br>Caches successfully created, please refresh.');
    }
若是cachelost中有東西的話,那麼就調用include/cache.func.php,並用這個文件裏面定義的updatecache();來更新緩存,並強制訪問者刷新論壇,使緩存當即生效。
複製內容到剪貼板
代碼:
if(!defined('CURSCRIPT') || CURSCRIPT != 'wap') {
            if($nocacheheaders) {
                    @dheader("Expires: 0");
                    @dheader("Cache-Control: private, post-check=0, pre-check=0, max-age=0", FALSE);
                    @dheader("Pragma: no-cache");
            }
            if($headercharset) {
                    @dheader('Content-Type: text/html; charset='.$charset);
            }
            if(empty($_DCOOKIE['sid']) || $sid != $_DCOOKIE['sid']) {
                    dsetcookie('sid', $sid, 604800);
            }
    }
這裏是設置網頁的header用的,經過判斷是否是wap或者是否是有CURSCRIPT這個常量(注:CURSCRIPT表明了當前執行的 script,比方說forumdisplay.php中就會有define(‘CURSCRIPT’, ‘forumdisplay’);這樣的定義),下一行是說sid過時了,再生成一個,dsetcookie()這個函數是. /include/global.func.php這個文件中定義的。
複製內容到剪貼板
代碼:
if($cronnextrun && $cronnextrun <= $timestamp) {
            require_once DISCUZ_ROOT.'./include/cron.func.php';
            runcron();
    }
呵呵,後臺的計劃任務來了。。。。固然,這種狀況是要至少有一個會員訪問論壇,若是說沒有人訪問,你再設置也沒有用,PHP的一大痛處,不能本身執行…
複製內容到剪貼板
代碼:
if(isset($plugins['include']) && is_array($plugins['include'])) {
            foreach($plugins['include'] as $include) {
                    if(!$include['adminid'] || ($include['adminid'] && $include['adminid'] >= $adminid)) {
                            @include_once DISCUZ_ROOT.'./plugins/'.$include['script'].'.inc.php';
                    }
            }
    }
這裏的加載一些插件的文件。
複製內容到剪貼板
代碼:
if((!empty($_DCACHE['advs']) || $globaladvs || $redirectadvs) && !defined('IN_ADMINCP')) {
            require_once DISCUZ_ROOT.'./include/advertisements.inc.php';
    }
這裏是看看是否是在論壇的cache中有廣告的存在(注:$_DCACHE這個數組中存放的是論壇的一些設置之類的緩存),有廣告的話就引用廣告的文件。
複製內容到剪貼板
代碼:
if(isset($allowvisit) && $allowvisit == 0 && !(defined('CURSCRIPT') && CURSCRIPT == 'member' && $action == 'groupexpiry')) {
            showmessage('user_banned', NULL, 'HALTED');
    } elseif(!((defined('CURSCRIPT') && in_array(CURSCRIPT, array('logging', 'wap', 'seccode'))) || $adminid == 1)) {
            if($bbclosed) {
                    clearcookies();
                    $closedreason = $db->result($db->query("SELECT value FROM {$tablepre}settings WHERE variable='closedreason'"), 0);
                    showmessage($closedreason ? $closedreason : 'board_closed', NULL, 'NOPERM');
            }
            periodscheck('visitbanperiods');
    }
論壇的安全訪問設置。一個是不容許訪問,另外一個是訪問到了member.php?action=groupexpiry的話,就說用戶被ban了。而後就 是檢查是否是論壇關閉了,能夠看也論壇關閉對管理員沒有影響。接下來檢查是否是禁的時間到了…periodscheck()函數就是這個用的。若是沒到是 會被showmessage說沒有訪問權限的,具體看include/global.func.php這個文件中的定義。固然,下一期我就會分析這個文 件。
複製內容到剪貼板
代碼:
if((!empty($fromuid) || !empty($fromuser)) && ($creditspolicy['promotion_visit'] || $creditspolicy['promotion_register'])) {
            require_once DISCUZ_ROOT.'/include/promotion.inc.php';
    }
這個固然是推薦註冊用的。應該沒看錯,呵呵。
複製內容到剪貼板
代碼:
$rssauth = $rssstatus && $discuz_uid ? rawurlencode(authcode("$discuz_uid\t".($fid ? $fid : '')."\t".substr(md5($discuz_pw.$discuz_secques), 0, 8), 'ENCODE', md5($_DCACHE['settings']['authkey']))) : '0';
Rss檢查
相關文章
相關標籤/搜索