zoukankan      html  css  js  c++  java
  • 我读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)比对已有结果的方式猜测一下密码。

  • 相关阅读:
    javascript 数字格式化
    spring-cloud blogs
    rabbitmq python
    centos7下 安装mysql
    hue install
    d3 document
    elastichq 离线安装
    elasticsearch agg
    elastichq auto connect
    Go Hello World!
  • 原文地址:https://www.cnblogs.com/alleyonline/p/7188581.html
Copyright © 2011-2022 走看看