好久没有开始写一篇像样的技术文档了,五一难得有这么多的时间,就早起来写一篇好的文章给大家吧~最近都忙一些自己的事情,没多少机会上网来回答问题,实在抱歉……
好了,言归正传,这次我打算写一个系列的文章,把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. }

复制代码

看看是不是index, forumdisplay, viewthread这些文件是不是缓存了,有的话把它装到$cachelost这个变量中。



http://www.discuz.net/forum.php?mod=viewthreadtid=611716page=1authorid=13759相关推荐

  1. 分享45个android实例源码,很好很强大.收藏吧!!! http://www.apkbus.com/forum.php?mod=viewthreadtid=20978 (出处: Android开

    分享45个android实例源码,很好很强大.收藏吧!!! http://www.apkbus.com/forum.php?mod=viewthread&tid=20978 (出处: Andr ...

  2. http://f.dataguru.cn/forum.php?mod=viewthreadtid=44212fromuid=4771

    http://f.dataguru.cn/forum.php?mod=viewthread&tid=44212&fromuid=4771 转载于:https://www.cnblogs ...

  3. http://www.apkbus.com/forum.php?mod=viewthreadtid=19181

    原文链接:http://www.apkbus.com/forum.php?mod=viewthread&tid=19181 注意是反转,不是翻转.贴图: 原图: 处理后: 下面看代码: pac ...

  4. Oauth2.0协议 http://www.php20.com/forum.php?mod=viewthreadtid=28 (出处: 码农之家)

    概要      OAuth2.0是OAuth协议的下一版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0. OAuth 2.0关注客户端开发者的简易性.要么通过组织在资源拥有者和HTTP ...

  5. http://www.apkbus.com/forum.php?mod=viewthreadtid=174440

    鉴于你懂得原因,google在中国访问受到了很大一部分的限制,更新SDK神马的都很费劲,本帖提供下载地址,对于无缘翻墙和稳定VPN的同学,可以不用访问google的android开发者网站即可实现资源 ...

  6. portal.php+mod,DISCUZ程序精简(去除Powered by Discuz和forum.php后缀)

    我们做论坛网站一般会采用DZ程序,对于DZ程序有很多的功能,但也存在着很多的无用的功能,对于学习如何做网站的学员来根本没用,而且会增加论坛网站的冗余代码,需要精减和优化. 1.去掉论坛网站顶部标题后缀 ...

  7. discuz misc.php慢,discuz提示misc.php?mod=patchaction=导致网站访问慢问题解决办法

    无忧主机小编平时没事的时候喜欢逛各大论坛,尤其多discuz建的论坛会特别留心一些,因为自己也玩过一段时间discuz.最近有看到一个网站,叫做"韩饭吧",也是使用discuz程序 ...

  8. 十大交易系统源码 (http://bbs.tb18.net/forum.php?mod=viewthreadaction=printabletid=22501)

    作者: tufeiyige    时间: 2012-7-21 11:22:05 据美国权威交易系统评选杂志<Futures Truth Magazine>2011 年10 月 最新发布的交 ...

  9. Discuz!X论坛开发(九)二次开发之Discuz X2 文件目录功能详解

    原文链接: http://www.discuz.net/forum.php?mod=viewthread&tid=2359270&reltid=1625972&pre_thre ...

最新文章

  1. Linux下CMake简明教程(五)正规一点的组织结构
  2. 【51NOD-0】1012 最小公倍数LCM
  3. HBase的基础知识
  4. Docker版本介绍(5)
  5. 四、Angular新建组件和使用
  6. 5. COM编程——IDispatch介绍
  7. 在VS2012集成Fortran95(Ftn95)
  8. 关于AD9371FilterWizard无法运行问题
  9. 《英雄联盟》捞月狗数据初探
  10. Quantum Espresso安装
  11. Matlab 实现两种读取文件夹内所有图像的方法
  12. 11408考研复习规划
  13. ValueError: y contains previously unseen labels: ‘103125‘
  14. php源码 拼车网顺风车_php版某拼车网源码分享 微信拼车打车约车源码 微信拼车+手机拼车+双终端+发布平台...
  15. 01redis安装及入门(含阿里云服务器出现的问题)
  16. c语言俄罗斯方块程序设计论文,c语言俄罗斯方块游戏程序设计报告
  17. 《Python编程:从入门到实践》 练习 9-4 9-5
  18. 【NVMe2.0b 12】NVM 容量模型
  19. Nginx安装和配置
  20. Ubuntu20.04网络连接不上

热门文章

  1. linux写u盘速度变慢,闪迪CZ80 U盘速度变慢怎么办恢复方法
  2. extundelete 恢复误删文件
  3. Android Studio常用快捷键、插件和功能
  4. Python错误集锦:python: can’t open file ‘hello’: [Errno 2] No such file or directory
  5. 计算机一级ps知识,计算机等级考试一级ps练习题及答案
  6. 机器学习算法汇报PPT
  7. matlab伪随机数(以及如何得到真正的随机数)
  8. 彻底清除谷歌浏览器注册表方法(简单有效)
  9. 秦皇岛计算机编程大赛,关于举办第三届河北省大学生程序设计竞赛燕山大学选拔赛的通知...
  10. dr.oracle素颜霜好用吗,这3款让韩国代购们月入上万的“素颜霜”真的好用吗?...