2019独角兽企业重金招聘Python工程师标准>>>
帝国在开源cms是一个非常强大的cms系统,有着自己非常详细的cms安全结构体系。优势是非常的安全,而且支持拓展也比较好,还有就是产品相比而言比较成熟,但是劣势也很明显,面向过程的编写方式,过于繁琐的验证机制,在读取解析程序的时候,问题也非常大。另外帝国的数据库操作效率也是非常差的,可以用xhprof进行检测查看,经常的数据运行语句,进行了反复的调用。这节主要是解析其一个公共文件connect.php。
核心文件connect.php作为其公共调用读取文件,插件开发的所有入口都需要加载该文件。$ecms_config将全局的配置放入里面,$public_r作为存放全局变量的数组。在一般的非MVC结构中,方法要访问对应的配置,一般都用一个全局数组的方式进行访问,只要在对应的函数里面写上global $ecms_config; global $public_r后就可以直接进行调用(在当前流行的MVC结构里,这种写法是不提倡的),面向对象的编程中,我们通常会把全局配置和需要的变量当成一个对象,而每一个元素都是其某一个属性。
相关变量初始化后,对访问端的IP进行检测eCheckAccessIp。该方法可以用来限定后台登录的时候是否允许唯一IP进行登录。除了控制访问者的ip,页面内部的一些来源跳转DoSafeCheckFromurl。这个是用来防止别人将我们的页面内部嵌套在不是我们的网站里。只能用在同一个域名下面。
do_dbconnect($dbhost,$dbport,$dbusername,$dbpassword,$dbname)是数据库连接的方法。当需要操作不同的数据库的时候,可以直接调用该方法(该方法也是帝国内部自己调用连接帝国本身数据库的方法)。一个简单的二次开发场景:添加的新闻信息需要推送到另外一个站点上去,可以直接在提交文章的地方,插入一个封装好的方法,connect到另外网站的数据库里。帝国另外的俩个自用函数db_connect(),return_dblink($query)数据库常用的一个思路是连接上帝国本身内部数据库后,将其赋值给一个全局变量$link,这样在后面加载运行的文件里需要该连接的时候,可以随时进行调用。db_close()也可以随时在中途将其关闭掉。
报错提示相关的方法(主要分为三类)
printerror($error="",$gotourl="",$ecms=0,$noautourl=0,$novar=0) js弹出报错提示
printerror2($error='',$gotourl='',$ecms=0,$noautourl=0) 网页报错提示
ajax_printerror($result='',$ajaxarea='ajaxarea',$error='',$ecms=0,$novar=0) ajax报错提示
printerrortourl($gotourl='',$error='',$sec=0) 出错跳转到的网址
当用户登录错误或者后台登录,网页出错等各种非法错误的情况下,会弹出对应的错误提示信息。
另外的一些方法包括:模板表转换(多张表需要识别的时候需要使用到),系统的时间函数处理,cookie的设置和读取,文件的读写和目录生成,字符串的处理,字符串的过滤,静态和伪静态的修正,防火墙相关。当然还有一些系统内部需要使用的方法,但是整体上看,还是比较凌乱的。
该文件的主要缺点和优点:
优点:集成了非常多的实用方法,基本cms常用的文本,cookie,时间,过滤,安全登录,提示框,数据库连接,ip的管理,数据表的分表设定,模板的替换都可以在这里找到想要的方法进行改造。可以看成一个非常大的源码继承库。
缺点也一样很明显:该文件有4000多行代码,几百个方法,从一些方面上看,这种布局结构是相当不合理的。各种用途的方法堆积在该文件里面,查找的时候,也是非常费劲。可能是由于帝国写的比较早,以前的时候,没有现在这么多好用的框架和一些比较规范的思想行为指导。而且从帝国对函数的命名方法来看,也是非常糟糕的。导致学习的成本非常的高,如果要改其内核,是一件非常需要花费时间的事情。