我读Discuz代码的一些收获

这段时间因为要用到Discuz论坛,粗略读了一下代码,就有一些收获,和大家共享:


1、模块化跳转:
之前我习惯用require或者include之类指令把PHP文件包含进来,在调用文件中访问新php文件的类或者方法,而发现Discuz几乎全部是用require之类指令包含进这个文件,在新文件中直接有处理代码,相当于goto到新文件过去,用$_G[]之类的全局变量来传输参数,确实不错,使跳转很清晰。
而且,在require_once跳转的时候,把php部分文件名作为变量来处理,例如require_once libfile('home/'.$mod, 'module'),这样就相当方便了,利用action指令来跳转不同的模块。


2、模板化
论坛本身是大量动态化内容,需要和数据库频繁交互,访问量大时,很容易卡。Discuz用了模板的概念,简单的说就是用php生成html页面,这个html页面就php根据template来生成的,template其实就是html中定义了标签和简单语法(例如循环之类),用户请求php页面时,php根据设定的缓冲超时时间,来确定是直接读取之前生成的html返回给用户,还是重新从数据库请求生成新的Html内容并返回给用户。而且在用户写入数据的时候,例如发贴或者回帖时,会通知刷新html缓冲,从而即使缓冲没有超时,也能刷新。
这样能解决动态数据和静态化的问题,而且还能让逻辑和界面分离,更好的分工,淘宝店铺之类应该也是类似原理了。而且对于很多网站有大量重复的地方,例如界面开头和结尾,就可以用子模板header.html和footer.html的模板来描述,在php生成的时候包含进去就可以了。整个结构就优雅很多了。


3、小技巧
1)之前我用字段数据生成sql语句时,例如字段:表t中,a=1,b=2,要生成update,update t set a=1, b=2。用数组生成的时候,我一直的用法是"a=1,b=2,",然后去掉最后那个",",而下面代码就优雅很多,其实就是换一种思维,“空a=1",然后是”,b=2",不看别人源码,很容易陷入固定思维,尤其是像我比较懒的。

 

 

[php] view plain copy
 
  1.   
[php] view plain copy
 
  1. function implode_field_value($array, $glue = ',') {  
  2.         $sql = $comma = '';  
  3.         foreach ($array as $k => $v) {  
  4.             $sql .= $comma."`$k`='$v'";  
  5.             $comma = $glue;  
  6.         }  
  7.         return $sql;  
  8.     }  

 

2)Discuz的class_core.php文件中,封装了一个DB类,其中的单例用法很特别:

 

[php] view plain copy
 
  1. function &object($dbclass = 'db_mysql') {  
  2.     static $db;  
  3.     if(empty($db)) $db = new $dbclass();  
  4.     return $db;  
  5. }  

用了一个object搞定了一般getInstance之类的,用起来简洁很多,而且用单例节省了一些mysql connect。一开始我对其这个类里没有平常mysql close之类的地方,感到很奇怪,竟然没有关闭连接,查了资料才发现,其实php的mysql连接其实没有必要关闭,在脚本结束的时候,会自动关闭的,这样在代码中写的时候就方便很多,例如每个中途return的时候,就无需写close之类的代码。

 

 

3)密码安全:

Discuz的密码md5的时候,用了一个salt的概念,其实就是md5(md5($password).$salt)

这样有一个好处,就是如果黑客获取到数据库的username和password,至少不能用md5($password)比对已有结果的方式猜测一下密码。

 

posted on 2017-07-15 23:45  alleyonine  阅读(212)  评论(0编辑  收藏  举报

导航