申明下版權(quán):
1.這里面的每個(gè)中文字都是我打的,code部分是引用的,當(dāng)然我也加了一點(diǎn)注釋在里面了。
2.如果要轉(zhuǎn)載的話請(qǐng)注明復(fù)制代碼
- 轉(zhuǎn)自[url]www.discuz.net[/url] 作者:郭鑫
3.由于我個(gè)人的能力有限,寫(xiě)這篇文章沒(méi)有參考一點(diǎn)資料,甚至連本地環(huán)境也沒(méi)有搭建(遇到了白屏問(wèn)題),所以難免會(huì)有錯(cuò)誤的地方,大家發(fā)現(xiàn)了的話請(qǐng)跟帖或者聯(lián)系我吧,我會(huì)盡快更正。
復(fù)制代碼
- //定義PHP一些環(huán)境
- error_reporting(0);
- set_magic_quotes_runtime(0);
- //設(shè)置Discuz開(kāi)始的時(shí)間
- $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)); //獲得絕對(duì)目錄
- //通用性
- 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;
- }
這一段基本上就是設(shè)置一下錯(cuò)誤報(bào)告,把magic_quotes這個(gè)sick家伙給關(guān)了,然后定一個(gè)開(kāi)始的時(shí)間,這樣我們?cè)谡搲撞靠吹降腜rocess Time就是通過(guò)這個(gè)開(kāi)始的時(shí)間和一個(gè)結(jié)束的時(shí)間的差來(lái)計(jì)算的,然后定義一個(gè)IN_DISCUZ為真,這個(gè)IN_DISCUZ常量的作用就是在其他inc這樣的包含文件中防止被非法引用,一旦沒(méi)有這個(gè)常量的話就出現(xiàn)Access Denied這樣的字樣然后退出。然后獲得Discuz運(yùn)行的絕對(duì)目錄。接下來(lái)是判斷PHP 的版本是4.1 以下還是以上,因?yàn)镻HP以4.1為一個(gè)分界線,在4.1以下以$HTTP_GET_VARS[‘xx’]這樣的方式來(lái)得到get過(guò)來(lái)的值,而以后用$_GET來(lái)得到get過(guò)來(lái)的值,這樣做的目的是為了無(wú)論是什么樣的PHP版本,都能用$_GET這樣的方式得到,有通用性~!
復(fù)制代碼
- require_once DISCUZ_ROOT.'./include/global.func.php';
把include/global.inc.php引用進(jìn)來(lái),這個(gè)文件是Discuz的核心函數(shù)文件,包含了Discuz用到的很多通用的函數(shù),可以說(shuō)它就是一個(gè)大的通用函數(shù)庫(kù)。
復(fù)制代碼
- define('ISROBOT', getrobot());
- if(defined('NOROBOT') && ISROBOT) {
- exit(header("HTTP/1.1 403 Forbidden"));
- }
這里是定義一個(gè)ISROBOT常量,看看瀏覽者是什么東東,比方說(shuō)如果瀏覽者是一個(gè)robot那么就直接來(lái)一個(gè) 403 Forbidden了……
復(fù)制代碼
- 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);
此處是過(guò)濾提交的變量用的,提高安全性的用法。。
復(fù)制代碼
- $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這個(gè)配置文件,這樣開(kāi)始初始化程序的一些東西了。接下來(lái)的一個(gè)循環(huán)把$_COOKIE中的東西取出來(lái)存到$_DCOOKIE這個(gè)數(shù)組中。注意:在登陸的時(shí)候Discuz會(huì)把登陸信息存放到$_COOKIE中去。在下面一段會(huì)有取出的代碼。
復(fù)制代碼
- unset($prelength, $_request, $_key, $_value);
- $timestamp = time();
- if($attackevasive) {
- require_once DISCUZ_ROOT.'./include/security.inc.php';
- }
這一部分代碼是提高安全用的,防一些非法的入侵,include/security.inc.php文件中就是這樣一些檢查。
復(fù)制代碼
- 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引用進(jìn)來(lái),這個(gè)文件是一個(gè)數(shù)據(jù)庫(kù)的類(lèi)。我覺(jué)得是不是放在這里太早了點(diǎn)?
然后接下的作用就是得到自身的名稱(chēng)$PHP_SELF,自身的文件名字$SCRIPT_FILENAME,論壇的地址$boardurl,得到瀏覽者的一些信息,比方說(shuō)ip地址,瀏覽器類(lèi)型等等。
復(fù)制代碼
- preg_match("/[\d\.]{7,15}/", $onlineip, $onlineipmatches);
- $onlineip = $onlineipmatches[0] ? $onlineipmatches[0] : 'unknown';
- unset($onlineipmatches);
看看ip是不是點(diǎn)分段,7-15個(gè)數(shù)字之間,用到了一個(gè)正則表達(dá)式,
復(fù)制代碼
- $cachelost = (@include DISCUZ_ROOT.'./forumdata/cache/cache_settings.php') ? '' : 'settings';
- @extract($_DCACHE['settings']);
這一段是獲得./forumdata/cache/cache_settings.php(即緩存下的設(shè)置數(shù)組,并展開(kāi),方面以后的寫(xiě)法
復(fù)制代碼
- if($gzipcompress && function_exists('ob_gzhandler') && CURSCRIPT != 'wap') {
- ob_start('ob_gzhandler');
- } else {
- $gzipcompress = 0;
- ob_start();
- }
檢查gzip是不是打開(kāi)了,打開(kāi)就用ob_gzhandler,沒(méi)有就用ob_start。
復(fù)制代碼
- 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了吧?呵呵,平衡負(fù)載用的。
復(fù)制代碼
- 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;
- }
歡迎光臨 Discuz! 官方交流社區(qū) (http://r615.cn/) | Powered by Discuz! X5.0 |