DZ论坛核心代码分析计划【提供SVN和压缩包】【2008-11-11更新】
时间:2008-10-04
来源:互联网
网上搜罗一下,也没发现有详细的分析文件或者分析列表。既然php代表了开源代表了共享。为什么不这么做呢?
况且DZ的代码风格非常顺畅,看起来很舒适。而且有很多好的习惯和思路在里面,能学到很多东西.
这几天消失就是搞他去了。。。喜欢鄙人这些还没完成的教程的朋友,欢迎常来坐坐。加入收藏和邮件订阅是最好的选择
开始从根目录下的index.php开始分析。我知道DZ采用了自创的模板系统。而且非常好用。但我不打算根据网上朋友的经验从include文件包开始分析。因为思路上太散了。所以我是根据页面使用习惯开始分析代码的。预计3天时间能出另一部分。
这一系列贴是我的初步分析篇。只是对其结构和代码组建思维以我个人的想法进行简单的分析。等全部工作完成,按现在的速度算(因为我也要上班,没时间天天扑上面)。一个月全部的初步分析篇大致能完成。然后接下来的工作是根据初步分析进行仔细的分析和应用。大致上是这样安排我的php自学过程的。
希望这点东西对和我一样学习方法的朋友有效。
事实上我建立了一个文件目录及作用表,但现在分析的内容比较少。所以暂时不发上来。等全部搞完了再发布。
说明:是基于最新的DZ6.1的核心代码!文件上我根据我自己的判断有的函数有的过程每一步都详细说明,有的并没有说得很清楚只是说明这个函数的大致作用。如果想根据我的的注释版来分析。注释就是作为各位的一个参考元素。如果有没有注释正确的,请跟贴说明。谢谢。附上我的总结笔记就是用来分享我从代码中学到的东西
希望有和我同样兴趣研究DZ的志同道合者发论坛小刀给我。。众人拾柴火焰高
新入成员组。感谢以下人士一起开展分析工作:
分析计划:
最近太忙了。奔丧用了几天,公司的事也用了几天。但还是挤出时间来做注释分析工作。下面附录文件是暂时已知的文件结构文件,供参考,未完成
注意:鄙人的文件编码是用的UTF-8.可能你打开是乱码。请用DW将文件转换成DW才可以。因为我为了避免文件的乱码问题,统一所有设置全部是utf-8.一时忘记了改格式。
如果你的eclipes默认的不是utf-8.通过svn打开肯定是乱码。请下载下来。谢谢
提供SVN.需要和我一起更新的请论坛小刀我。我提供密码
SVN是将我的根目录作为存储库,所以是和我的文件更新速度一样的。当然,你不知道我在更新哪个文件也是没用的=。=简单的说,其实我是又偷懒了又没偷。偷懒,是因为我可以改多少放在svn上面多少。没偷懒是因为当我完成的时候,所有文件都将更新完毕。。省了我整理的问题
完成列表:完成的楼层有链接,未完成的没链接
2楼:1、DZ论坛核心代码分析计划--install包篇
简单描述:这个包进过分析和改变,可以了解DZ的安装系统是如何操作的。自己编写或者进过修改可以成为自己的安装文件
3楼:2、DZ论坛核心代码分析计划--核心文件global.func.php篇
简单描述:非常重要的全局函数文件。参考文件中的函数封装。了解DZ对字符串等全局的处理方式和过程。
4楼:3、DZ论坛核心代码分析计划--核心文件common.inc.php篇
简单描述:DZ论坛的指挥性文件,几乎所有文件都引入这个文件。最值得学习的是其对安全性的重视和处理
5楼:4、DZ论坛核心代码分析计划--include包(一)
简单描述:DZ论坛的include包,cache.func.php缓存文件、XML.class.phpXML解析器、counter.inc.php论坛计数器、security.inc.php:安全信息等级
6楼:5、DZ论坛核心代码分析计划--include包(二)
简单描述:trade.func.php chinese.class.php db_mysql_error.inc.php f t p.func.php
7楼:6、DZ论坛核心代码分析计划--include包(三)
8楼:7、DZ论坛核心代码分析计划--include包(四)
9楼:8、DZ论坛核心代码分析计划--include包(五)
10楼:9、DZ论坛核心代码分析计划--admin包(一)
11楼:10、DZ论坛核心代码分析计划--admin包(二)
12楼:11、DZ论坛核心代码分析计划--admin包(三)
13楼:12、DZ论坛核心代码分析计划--根目录(一)
14楼:13、DZ论坛核心代码分析计划--根目录(二)
15楼:14、DZ论坛核心代码分析计划--根目录(三)
16楼:15、DZ论坛核心代码分析计划--modcp包
17楼:16、DZ论坛核心代码分析计划--forumdata包
18楼:17、DZ论坛核心代码分析计划--API包
19楼:预留
20楼:预留
郑重申明。。可以转发鄙人的这个分析贴。因为我拿出来就是共享的。
请共享者注明作者:SamPeng
[ 本帖最后由 某个人 于 2008-11-11 16:40 编辑 ]

DZ论坛文件结构.rar (2.88 KB)
作者: 某个人 发布时间: 2008-10-04
Install篇
下面附上的是已经写好描述的源文件。。。很多值得借鉴的思想。就在这里留个坑吧。。。因为我电脑上东西乱仍。。某一年的某一天,我一不小心把我整合代码盘全删了。。。。很崩溃很崩溃。
分析没到每一行,那样太琐碎了。这样分析只是分析他的思路和思想。方法才是最重要的。函数自己随手就可以查的。
下面呢,是我的分析日记。2天就分析完了。挺简单的。不过很多东西我很少用,却及其有用。值得借鉴。
分析文件:install/index.php
1、
在代码的顶部引入error_reporting()方法,设定php的错误提示等级。事实上php的配置文件可以配置,但是在每个文件重新设定这个错误提示等级,使错误提示更为灵活。
2、
在某些条件下通过使用set_time_limit()设定运行时间,并且通过ob_start()打开输出缓冲器。最好用@来屏蔽错误。
3、
使用define()设定多个常量而不是变量供程序代码使用。
分析文件:discuz_version.php
文件作用:定义版权的常量值
1、
因为这个文件是被引入调用其设定好的常量。所以从理论上任何文件都能调用。所以在一开始通过判断是否IN_DISCUZ为真,如果不是,则停止整个程序的运行。
2008年10月4日9:42:22
分析文件db_mysql.class.php
文件作用:数据库的链接类
1、
通过一个判断来决定是采用mysql_connect(非持续性)还是mysql_pconnect(持续性)
2、
通过判断来决定是采用mysql_unbuffered_query(执行操作,但不返回任何数据)还是mysql_query(执行操作,可返回数据)
3、
1和2两个经验点,大量使用了?:运算符;如:(exp1?(exp2):(exp3)).若exp1为真则exp2,反之exp3。
4、
//mysql_num_fields-取得结果集中字段的数目
function num_fields($query) {
return mysql_num_fields($query);
}
5、
//释放结果内存
function free_result($query) {
return mysql_free_result($query);
}
2008年10月4日10:21:48
总结:因为被包含文件可以通过路径进行访问,为了保护文件的安全性,DZ在所有需要引用其他文件的前面定义了一个常量IN_DISCUZ。在被引入文件的头部对这个常量进行判断,如果没有这个常量,也就是直接通过路径进行访问的。则不执行源代码中的任何部分。这是个很好的保护源代码措施。而且很简单。
另,在分析Install文件包的时候我发现DZ程序员的思维确实很不错。考虑很多错误出现的情况并且进行处理。说实话这点我还真做不到。值得学习。并且其考虑了数据库或者php版本问题,在db_mysql.class.php文件里就使用了一个动态设定数据存储编码的方法。大家可以借鉴一下。
[ 本帖最后由 某个人 于 2008-10-7 09:39 编辑 ]

install.rar (61.66 KB)
已分析完毕的压缩包
作者: 某个人 发布时间: 2008-10-06
因为这个包代码很多。只把个人重要的仔细分析了每个代码块。
在上一个文分析计划里,我其实少上两个文件,一个是DZ论坛全局变量申明表。DZ论坛文件作用表。DZ论坛函数调用处表。
因为分析的东西暂时比较少,所以没有上上来。等全部搞完再说吧。
学习日记如下:
只更新一部分。。。。还有另一部分。。下午更新上来
Golbal.func.php
日记时间:2008年10月7日10:37:34
1、 这个文件是常被引用的文件,所以开头还是采用了惯用的常量判断法。防止被恶意浏览器直接打开
2、 加密函数authcode中的加密有多次的md5叠加加密。保证密码的安全性。在常有的思维中,一般是只加密了一次。而在DZ的加密函数中。加密算法很复杂。分别从md5加密,字符随机截断加密,位运算加密和与密匙结合加密。
3、 DZ的字符处理工作非常好。虽然在下载的时候我们会选择utf-8还是gbk。但是不管是处理字符还是处理数据库链接的时候都是第一考虑字符编码的地方。在db_mysql.class.php文件的数据库链接上就判断了格式是什么。代码如下
$func = empty($pconnect) ? 'mysql_connect' : 'mysql_pconnect';
//建立一个链接给类的属性link之中。并且在建立链接的时候就设定编码方式是如何的。
if(!$this->link = @$func($dbhost, $dbuser, $dbpw, 1)) {
$halt && $this->halt('Can not connect to MySQL server');
} else {
if($this->version() > '4.1') {
global $charset, $dbcharset;
$dbcharset = $dbcharset2 ? $dbcharset2 : $dbcharset;
$dbcharset = !$dbcharset && in_array(strtolower($charset), array('gbk', 'big5', 'utf-8')) ? str_replace('-', '', $charset) : $dbcharset;
$serverset = $dbcharset ? 'character_set_connection='.$dbcharset.', character_set_results='.$dbcharset.', character_set_client=binary' : '';
$serverset .= $this->version() > '5.0.1' ? ((empty($serverset) ? '' : ',').'sql_mode=\'\'') : '';
$serverset && mysql_query("SET $serverset", $this->link);
}
再在global.func.php文件中的字符串处理也是考虑了字符串的编码格式问题的。
有个全局变量$charset就是用来设定编码格式的。Cutstr里根据这个变量的值来对字符串进行处理。
另,在cutstr()函数里,在进行截断之前会将字符串中的特殊字符进行处理。
$string = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $string);
在处理截断之后,再将其还原。
$strcut = str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), $strcut);
这就能解释为什么DZ论坛截断后的文字依然符合原有的文字格式。
4、 对html代码格式自定义替换。但这里要注意一下DZ考虑得很周到。
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = dhtmlspecialchars($val);//如果是数租,遍历数组再调用自身的这个函数对单个字符处理。
}
判断如果传入的字符串是数组呢?恩。按我的想法是,只封装字符的替换部分。但他这里封装得很好。因为我在调用这个函数的时候就不用担心我传递的是什么格式的字符串了。
5、 将页面跳转封装在了dheader函数里
6、//典型的减少代码重复输入函数。处理好email字符串。只需要emailconv(email地址)就能返回一个已经编码好的email地址了
function emailconv($email, $tolink = 1) {
$email = str_replace(array('@', '.'), array('@', '.'), $email);
return $tolink ? '<a href="mailto: '.$email.'">'.$email.'</a>': $email;
}
7、//对文件名进行截断处理,输入文件名,返回处理后的文件名
function fileext($filename) {
return trim(substr(strrchr($filename, '.'), 1, 10));
}
8、 DZ处理浏览器直接输入路径访问问题是用的判断常量法。但是机器人呢?机器人可没常量。但是php有和自定义常量:$_SERVER['HTTP_USER_AGENT']。这两个是用来判断机器人的名称的。里面还包含了名字。于是机器人的判断法如下:
//通过分析调用这个函数的common.inc.php文件。这个函数是用来判断对机器人的处理方式的。
function getrobot() {
if(!defined('IS_ROBOT')) {
//定义搜索引擎名
$kw_spiders = 'Bot|Crawl|Spider|slurp|sohu-search|lycos|robozilla';
//定义浏览器种类名
$kw_browsers = 'MSIE|Netscape|Opera|Konqueror|Mozilla';
//判断是否是这些浏览器,如果是,则定义IS_ROBOT这个常量为假。反之则判断蜘蛛是不是上述已经定义好的搜索引擎,如果是则定义IS_ROBOT这个常量为真。如果都不满足条件,定义IS_ROBOT这个常量为假。
if(preg_match("/($kw_browsers)/i", $_SERVER['HTTP_USER_AGENT'])) {
define('IS_ROBOT', FALSE);
} elseif(preg_match("/($kw_spiders)/i", $_SERVER['HTTP_USER_AGENT'])) {
define('IS_ROBOT', TRUE);
} else {
define('IS_ROBOT', FALSE);
}
}
//返回IS_ROBOT这个常量的值
return IS_ROBOT;
}
在common.inc.php文件里调用是这样处理的:
//通过这个常量,不允许机器人随意访问这个页面。
define('IS_ROBOT', getrobot());
if(defined('NOROBOT') && IS_ROBOT) {
exit(header("HTTP/1.1 403 Forbidden"));
}
看回来还是常量法。只是这个常量的值是通过函数getrobot()获取的。
更新错误:这些错误是我分析在其调用的地方得知的错误。但不可能我发现一点改一点,所以在这里说明
谢谢下面这些人的帮助
shishirui 分析:global.func.php 中第七条:fileext()这个函数是用来获得文件扩展名用的。
[ 本帖最后由 某个人 于 2008-10-8 16:07 编辑 ]

global.func.rar (17.68 KB)
作者: 某个人 发布时间: 2008-10-06
真正分析起来,其实内容并不多。大多是条件判断和指挥类的语句。引入大量文件。
理解这个文件可以更好的理解整个DZ的论坛是如何运作的。几乎每个页面都引入了这个文件的。
说实话,越往后面看我头越大。。。大量的多层3维条件判断。。嘿嘿,不知道说错没,就是?:这种类型的。有的镶嵌了4层之多。头晕啊。不过大致完成了。
这个文件最值得学习的是其对安全性的重视和处理。。
下面先上写好注释的文件
其他文件整理后随后发上来。不过这个足够说明很多东西了。
写得不对的地方望各位高手指出
[ 本帖最后由 某个人 于 2008-10-7 16:42 编辑 ]

common.inc.rar (8.07 KB)
已经写好注释文件
作者: 某个人 发布时间: 2008-10-06
cache.func.php文件没分析完,但具体缓存的操作原理是将配置文件从数据库中取出,经过特定的处理后缓存进内存,再然后读取到各数据库或者页面之中。
security这个文件就是防止多次刷新的安全信息等级文件拉。大家可以参考一下他的防多次刷新机制的运行模式。
因为时间比较紧。所以不过多说明,具体看我的分析文件。
[ 本帖最后由 某个人 于 2008-10-17 09:34 编辑 ]

include.rar (26 KB)
作者: 某个人 发布时间: 2008-10-06
今天上的是4个包。
trade.func.php j交易接口的提供等操作。
ftp.func.php ftp上传的相关函数,打开,关闭,登陆等等ftp的操作这个文件包里都有说明
chinese.class.php 这个类包我只看明白他的流程,具体怎么转换的涉及到位运算,看不明白。。但我想我的注释应该足够说明了。总之可以直接拿来用的
db_mysql_error.inc.php 数据库链接发生错误的文件包。挺简单的。
[ 本帖最后由 某个人 于 2008-11-11 16:35 编辑 ]

include.rar (10.48 KB)
作者: 某个人 发布时间: 2008-10-06
但是不仅仅是写写注释,我还要总结。所以速度慢了点
[ 本帖最后由 某个人 于 2008-10-7 09:28 编辑 ]
作者: 某个人 发布时间: 2008-10-06
[ 本帖最后由 某个人 于 2008-10-7 09:29 编辑 ]
作者: 某个人 发布时间: 2008-10-06
作者: 某个人 发布时间: 2008-10-06
[ 本帖最后由 某个人 于 2008-10-7 09:29 编辑 ]
作者: 某个人 发布时间: 2008-10-06
[ 本帖最后由 某个人 于 2008-10-7 09:29 编辑 ]
作者: 某个人 发布时间: 2008-10-06
作者: 某个人 发布时间: 2008-10-07
作者: 某个人 发布时间: 2008-10-07
作者: 某个人 发布时间: 2008-10-07
作者: 某个人 发布时间: 2008-10-07
作者: 某个人 发布时间: 2008-10-07
作者: 某个人 发布时间: 2008-10-07
作者: 某个人 发布时间: 2008-10-07
作者: 某个人 发布时间: 2008-10-07
作者: 某个人 发布时间: 2008-10-07
作者: 某个人 发布时间: 2008-10-07
作者: bing19880122 发布时间: 2008-10-07
作者: ssword 发布时间: 2008-10-07
作者: xiongxiaoming 发布时间: 2008-10-07
作者: heixiake 发布时间: 2008-10-07
:funk:
版主大人汗啥子。。
作者: 某个人 发布时间: 2008-10-07
作者: 清竹飛翔 发布时间: 2008-10-07
作者: 某个人 发布时间: 2008-10-07
作者: spzgy 发布时间: 2008-10-07
我想SVN的话,我们会更加爽一点,哈哈哈
SVN我不会。。。。
再说。我弄这么个东西是一起学习一起进步的。。
作者: 某个人 发布时间: 2008-10-07
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28