久久久久av_欧美日韩一区二区在线_国产精品三区四区_日韩中字在线

Discuz! 官方交流社區

標題: 史上第一強:Discuz!源代碼分析系列(1)--./include/common.inc.php [打印本頁]

作者: 我是小站長    時間: 2019-6-2 19:20
標題: 史上第一強:Discuz!源代碼分析系列(1)--./include/common.inc.php
好久沒有開始寫一篇像樣的技術文檔了,五一難得有這么多的時間,就早起來寫一篇好的文章給大家吧~最近都忙一些自己的事情,沒多少機會上網來回答問題,實在抱歉……
好了,言歸正傳,這次我打算寫一個系列的文章,把Discuz的核心文件的源代碼一一分解解釋出來,大家都知道Discuz的源代碼是很經得起時間的考驗的,是眾多程序員智慧的結晶,我想大家能借鑒一下也是很不錯的,唯一一點不好就是,不是OOP(面向對象)的,我最近看了幾個框架(framework),也用了一下,感覺OOP的編程讓人熱血沸騰,大大提高了開發效率,一個小型論壇的開發的話不用像Discuz 這樣寫這么這么多的代碼,很是不錯,不過說到面向對象,當然要看看Java,Jsp 或ASP.NET,前兩個看得我郁悶,沒看了,只學會了ASP.NET,感覺很不錯,比PHP先進多了,針對事件、驅動編程,封裝,編譯,跨平臺,聽著就覺得很帥了,很適合大型應用,呵呵,扯遠了……
申明下版權:
1.這里面的每個中文字都是我打的,code部分是引用的,當然我也加了一點注釋在里面了。
2.如果要轉載的話請注明
  1. 轉自[url]www.discuz.net[/url] 作者:郭鑫
復制代碼

3.由于我個人的能力有限,寫這篇文章沒有參考一點資料,甚至連本地環境也沒有搭建(遇到了白屏問題),所以難免會有錯誤的地方,大家發現了的話請跟帖或者聯系我吧,我會盡快更正。

第一個文件當然是分析./include/common.inc.php這個文件,這個是Discuz的核心中的核心,基本上每次操作都include到了這個文件,下面就分七段來分析這個文件:

Section One:

  1. //定義PHP一些環境
  2. error_reporting(0);
  3. set_magic_quotes_runtime(0);

  4. //設置Discuz開始的時間
  5. $mtime = explode(' ', microtime());
  6. $discuz_starttime = $mtime[1] + $mtime[0];

  7. //定義一些常量
  8. define('SYS_DEBUG', FALSE);
  9. define('IN_DISCUZ', TRUE);
  10. define('DISCUZ_ROOT', substr(dirname(__FILE__), 0, -7)); //獲得絕對目錄

  11. //通用性
  12. if(PHP_VERSION < '4.1.0') {
  13.         $_GET = &$HTTP_GET_VARS;
  14.         $_POST = &$HTTP_POST_VARS;
  15.         $_COOKIE = &$HTTP_COOKIE_VARS;
  16.         $_SERVER = &$HTTP_SERVER_VARS;
  17.         $_ENV = &$HTTP_ENV_VARS;
  18.         $_FILES = &$HTTP_POST_FILES;
  19. }
復制代碼

這一段基本上就是設置一下錯誤報告,把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:

  1. require_once DISCUZ_ROOT.'./include/global.func.php';
復制代碼

把include/global.inc.php引用進來,這個文件是Discuz的核心函數文件,包含了Discuz用到的很多通用的函數,可以說它就是一個大的通用函數庫。


  1. define('ISROBOT', getrobot());
  2. if(defined('NOROBOT') && ISROBOT) {
  3.         exit(header("HTTP/1.1 403 Forbidden"));
  4. }
復制代碼

這里是定義一個ISROBOT常量,看看瀏覽者是什么東東,比方說如果瀏覽者是一個robot那么就直接來一個 403 Forbidden了……


  1. define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
  2. isset($_REQUEST['GLOBALS']) && exit('Access Error');
  3. foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
  4.         foreach($_request as $_key => $_value) {
  5.                 $_key{0} != '_' && $_key = daddslashes($_value);
  6.         }
  7. }
  8. (!MAGIC_QUOTES_GPC) && $_FILES = daddslashes($_FILES);
復制代碼

此處是過濾提交的變量用的,提高安全性的用法。。


  1. $charset = $dbcharset = $forumfounders = $metakeywords = $extrahead = '';
  2. $plugins = $hooks = $admincp = array();

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

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

  5. $prelength = strlen($cookiepre);
  6. foreach($_COOKIE as $key => $val) {
  7.         if(substr($key, 0, $prelength) == $cookiepre) {
  8.                 $_DCOOKIE[(substr($key, $prelength))] = MAGIC_QUOTES_GPC ? $val : daddslashes($val);
  9.         }
  10. }
復制代碼

初始化一些變量,然后引用config.inc.php這個配置文件,這樣開始初始化程序的一些東西了。接下來的一個循環把$_COOKIE中的東西取出來存到$_DCOOKIE這個數組中。注意:在登陸的時候Discuz會把登陸信息存放到$_COOKIE中去。在下面一段會有取出的代碼。


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

  3. if($attackevasive) {
  4.         require_once DISCUZ_ROOT.'./include/security.inc.php';
  5. }
復制代碼

這一部分代碼是提高安全用的,防一些非法的入侵,include/security.inc.php文件中就是這樣一些檢查。


  1. require_once DISCUZ_ROOT.'./include/db_'.$database.'.class.php';


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

  5. if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
  6.         $onlineip = getenv('HTTP_CLIENT_IP');
  7. } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
  8.         $onlineip = getenv('HTTP_X_FORWARDED_FOR');
  9. } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
  10.         $onlineip = getenv('REMOTE_ADDR');
  11. } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
  12.         $onlineip = $_SERVER['REMOTE_ADDR'];
  13. }
復制代碼

第一行是把include/db_mysql.class.php引用進來,這個文件是一個數據庫的類。我覺得是不是放在這里太早了點?
然后接下的作用就是得到自身的名稱$PHP_SELF,自身的文件名字$SCRIPT_FILENAME,論壇的地址$boardurl,得到瀏覽者的一些信息,比方說ip地址,瀏覽器類型等等。

Section Three:

  1. preg_match("/[\d\.]{7,15}/", $onlineip, $onlineipmatches);
  2. $onlineip = $onlineipmatches[0] ? $onlineipmatches[0] : 'unknown';
  3. unset($onlineipmatches);
復制代碼

看看ip是不是點分段,7-15個數字之間,用到了一個正則表達式,

  1. $cachelost = (@include DISCUZ_ROOT.'./forumdata/cache/cache_settings.php') ? '' : 'settings';
  2. @extract($_DCACHE['settings']);
復制代碼

這一段是獲得./forumdata/cache/cache_settings.php(即緩存下的設置數組,并展開,方面以后的寫法

  1. if($gzipcompress && function_exists('ob_gzhandler') && CURSCRIPT != 'wap') {
  2.         ob_start('ob_gzhandler');
  3. } else {
  4.         $gzipcompress = 0;
  5.         ob_start();
  6. }
復制代碼

檢查gzip是不是打開了,打開就用ob_gzhandler,沒有就用ob_start。

  1. if(!empty($loadctrl) && substr(PHP_OS, 0, 3) != 'WIN') {
  2.         if($fp = @fopen('/proc/loadavg', 'r')) {
  3.                 list($loadaverage) = explode(' ', fread($fp, 6));
  4.                 fclose($fp);
  5.                 if($loadaverage > $loadctrl) {
  6.                         header("HTTP/1.0 503 Service Unavailable");
  7.                         include DISCUZ_ROOT.'./include/serverbusy.htm';
  8.                         exit();
  9.                 }
  10.         }
  11. }
復制代碼

看到了熟悉的service unavailable了吧?呵呵,平衡負載用的。


  1. if(defined('CURSCRIPT') && in_array(CURSCRIPT, array('index', 'forumdisplay', 'viewthread', 'post', 'blog', 'pm', 'topicadmin', 'register', 'archiver'))) {
  2.         $cachelost .= (@include DISCUZ_ROOT.'./forumdata/cache/cache_'.CURSCRIPT.'.php') ? '' : ' '.CURSCRIPT;
  3. }
復制代碼



作者: 耗子    時間: 2019-6-2 19:57
:) 收藏了 很需要!
作者: tuhemm    時間: 2023-3-29 00:31
提示: 作者被禁止或刪除 內容自動屏蔽
作者: 398601673    時間: 2023-4-7 10:22
:) 收藏了 很需要!

作者: tcfa    時間: 2023-4-7 16:54
支持支持zc
作者: yuanbintb    時間: 2023-7-10 16:00
收藏了,學習一下
作者: plaodj    時間: 2023-7-11 13:22
:) 收藏了 很需要!
作者: 71954443    時間: 2023-8-12 05:51
DDDDDDDDDDDDDDDDDDD
作者: DayFall    時間: 2023-8-15 16:27
感謝分享!
作者: aike45    時間: 2023-8-21 21:54
:) 收藏了 很需要!:) 收藏了 很需要!
作者: chenxu001    時間: 2024-2-23 17:03
學習一下
作者: 郭子ㄨ新仔papa    時間: 2024-3-5 13:03
求解如何在DZ源代碼中加入自己的源代碼
作者: 1225678    時間: 2024-4-18 22:51
終于可以說話了
作者: 陳濤    時間: 2024-4-26 15:38
要從頭學習了
作者: 勿忘我f    時間: 2024-6-19 18:17
看看好東西
作者: 阿榮啊    時間: 2024-6-24 15:16
666666666666666666666
作者: yuanbintb    時間: 2024-6-27 11:21
收藏學習
作者: wyx666    時間: 2025-1-30 18:37
:) 收藏了 很需要!
作者: 哄哄    時間: 2025-2-12 19:30
學習了,樓主好人有好運
作者: ejund2025    時間: 2025-2-26 18:39
學習學習學習學習學習學習學習學習學習學習學習學習學習學習
作者: Zinc    時間: 2025-2-28 10:13
學習一下,感謝
作者: paullee0121    時間: 2025-4-10 09:10
這份分析註解文件很好 來收藏一下 謝謝樓主分享
作者: 永遠是第一次    時間: 2025-8-28 19:13
:) 收藏了 很需要!:) 收藏了 很需要!




歡迎光臨 Discuz! 官方交流社區 (http://www.9999xn.com/) Powered by Discuz! X5.0
久久久久av_欧美日韩一区二区在线_国产精品三区四区_日韩中字在线
欧美性受xxxx黑人xyx性爽| 欧美一区二区福利视频| 免费国产自线拍一欧美视频| 国产欧美日韩在线视频| 不卡高清视频专区| 91精品婷婷国产综合久久性色| 欧美a级理论片| 蜜桃久久精品乱码一区二区| 1区2区3区精品视频| 99久久久精品免费观看国产蜜| 欧美一区二区三区视频免费播放| 美腿丝袜亚洲一区| 久久久久欧美精品| 亚洲第一激情av| 亚洲欧美日本日韩| 自拍偷拍亚洲综合| 国户精品久久久久久久久久久不卡| 久久久午夜精品理论片中文字幕| 成人性生交大片免费看视频在线| 欧美一级黄色大片| 国产成人99久久亚洲综合精品| 欧美一区二区三区的| 成人午夜电影小说| 欧美成人精精品一区二区频| 国v精品久久久网| 国产成人福利片| 欧美一二三区精品| 国产成人免费在线视频| 日韩欧美成人一区二区| a4yy欧美一区二区三区| 精品国产乱码久久久久久夜甘婷婷| 成人中文字幕电影| 精品国产免费一区二区三区香蕉| 成人av在线看| 久久久.com| 一区在线播放| 亚洲激情在线激情| 亚洲欧美日本日韩| 日本亚洲视频在线| 欧美日精品一区视频| 国产原创一区二区| 日韩视频中午一区| 99久久精品久久久久久清纯| 国产欧美1区2区3区| 亚洲韩日在线| 图片区日韩欧美亚洲| 欧美一区二区三区系列电影| 色综合天天综合给合国产| 欧美一区二区三区视频在线观看| 国产精品一区一区| 精品日韩在线一区| 欧美高清视频一区| 亚洲三级在线播放| 欧美中文字幕| 亚洲欧美日韩国产| 免费在线观看不卡| 欧美一级理论片| 91香蕉视频mp4| 亚洲色图制服诱惑 | 91麻豆福利精品推荐| 亚洲四区在线观看| 久久午夜精品一区二区| 性久久久久久久久| 女女同性精品视频| 亚洲视频在线一区观看| 亚洲欧美99| 久久精品理论片| 精品国产乱码久久久久久蜜臀| 欧美久久久久| 亚洲宅男天堂在线观看无病毒| 色偷偷久久一区二区三区| 国产成人精品一区二区三区网站观看| 久久综合久久综合久久综合| 激情久久久久| 亚洲成a天堂v人片| 欧美美女bb生活片| 欧美一区1区三区3区公司| 亚洲视频在线一区| 在线观看一区二区视频| 国产河南妇女毛片精品久久久 | 亚洲综合色区另类av| 欧美日韩一区二区在线观看 | 欧美 日韩 国产在线| 亚洲综合在线视频| 欧美人伦禁忌dvd放荡欲情| 午夜电影亚洲| 亚洲国产成人av好男人在线观看| 欧美日韩三级视频| 欧美日韩国产成人精品| 亚洲成人av一区二区| 日韩欧美亚洲一区二区| 亚洲三级网站| 精品一区二区三区不卡 | 亚洲三级理论片| 欧美伦理影视网| 亚洲高清视频一区| 精品综合免费视频观看| 国产精品久久久久久久午夜片 | 欧美国产精品| 日本网站在线观看一区二区三区| 欧美精品一区二区高清在线观看| 国产欧美日韩一区二区三区在线| 国产精品18久久久| 一区二区三区久久| 精品国产乱子伦一区| 久久精品亚洲| 欧美成人有码| 久久精品国产99国产| 中文字幕不卡一区| 久久精品天堂| 欧美成人首页| 国产一区二区中文字幕| 亚洲精品一二三区| 欧美电视剧在线观看完整版| 亚洲欧美日韩精品久久久| 91丨九色porny丨蝌蚪| 六月婷婷色综合| 亚洲欧美激情一区二区| 日韩三级中文字幕| 午夜影院日韩| 欧美日韩一区二区三区在线观看免| 久久国产精品99久久久久久老狼| 亚洲免费大片在线观看| 亚洲福利一区| 波多野结衣中文字幕一区二区三区| 亚洲妇女屁股眼交7| 国产日韩精品一区二区浪潮av| 色哟哟国产精品| 亚洲午夜黄色| 国产成人在线看| 日韩av电影免费观看高清完整版| 国产精品色一区二区三区| 欧美一区二区三区色| 久久资源av| 亚洲黄色毛片| 91美女蜜桃在线| 国产乱子轮精品视频| 亚洲成人先锋电影| 国产精品不卡一区二区三区| 国产欧美日韩一区二区三区| 色综合久久综合网97色综合| 国产在线精品视频| 亚洲成a天堂v人片| 亚洲欧美日韩在线不卡| 国产婷婷色一区二区三区四区 | 樱桃视频在线观看一区| 久久精品一区二区三区不卡牛牛| 欧美人狂配大交3d怪物一区| 久久亚洲精品伦理| 夜久久久久久| 欧美日韩一区二区三区在线视频 | 国产成人av影院| 精品一区二区三区在线视频| 亚洲成年人影院| 亚洲欧洲日韩综合一区二区| 久久综合色播五月| 日韩视频在线你懂得| 欧美日韩精品三区| 久久三级视频| 国产女主播一区二区| 亚洲黄色一区二区三区| 欧美另类专区| 91免费视频网| www.日韩大片| 不卡一区二区在线| 丁香激情综合国产| 狠狠v欧美v日韩v亚洲ⅴ| 欧美aaa在线| 日本在线不卡视频一二三区| 亚洲成人精品一区二区| 亚洲国产精品嫩草影院| 亚洲电影视频在线| 亚洲成人tv网| 亚洲mv在线观看| 亚洲国产成人porn| 亚洲国产中文字幕| 亚洲一区二区三区爽爽爽爽爽| 精品欧美乱码久久久久久1区2区 | 欧美一区二区三区播放老司机| 欧美日本视频在线| 欧美喷潮久久久xxxxx| 欧美日本一道本在线视频| 欧美日韩精品一区二区在线播放| 欧美在线制服丝袜| 欧美日韩精品福利| 欧美日本一道本在线视频| 在线成人av影院| 日韩视频免费观看高清完整版| 欧美一区日韩一区| 日韩欧美123| 久久综合色播五月| 久久久国际精品| 国产三级欧美三级日产三级99| 日本一区二区视频在线| 18成人在线观看| 亚洲制服丝袜一区| 亚洲chinese男男1069| 全国精品久久少妇| 免费成人av在线播放| 国产中文字幕一区|