PHPCMS v9 代码分析(转载)

页面的输出过程 第一, 通过 admin php的入口页面,根据不同的参数,包含不同的页面 第二, 后台的整体框架分为两部分,一部分是上边的头和菜单以及左

页面的输出过程

第一, 通过/admin.php的入口页面,根据不同的参数,包含不同的页面

第二, 后台的整体框架分为两部分,一部分是上边的头和菜单以及左边的菜单,另一部分是右边的操作区。通过jquery的load方法,只在操作区上加载各个页面的模板,实现局部刷新页面的效果,看样子像是框架,实际上是AJAX。

第三, 输出页面的准备工作是由/include/common.inc.php来完成的,而真正的输出页面的工作,是由template函数取出包含页面就可以了,比较简单。

第四, 这里主要介绍common.inc.php这个文件

首先,定义各个常数

其次,包含所有需要的文件,有包含文件、函数库和类文件,还有语言包

然后,判断是否开启了页面缓存,如果开启了,就输出缓存页面,具体的缓存机制稍后做详细分析

接着,用ob函数开辟一个缓存区,准备把输出的页面放入到缓存区,这里还判断了是否需要压缩页面。压缩页面的好处就是可以减少页面体积,提高浏览速度,但付出的代价就是服务器的性能。

开启数据库连接

判断是否开启了魔法函数,如果没有开启,需要用addslashes函数对GET、POST和Cookie进行非法字符的过滤,在用extract展开为变量

还需要对URL进行非法字符的判断,这些都是安全方面的考虑

如果开启了自动更新文本缓存,需要包含cache.func.php文件,然后更新缓存,这个选项最好是不要开启,否则会影响速度

获取文本缓存的内容,并展开为变量,然后unset文本缓存

如果是前台,需要判断刷新最小间隔时间

主要就是这么多步骤,这是访问所有php文件之前都必须做的准备工作,因为考虑得比较细,所以才会这么复杂。

4. 前台页面和后台页面输出过程的区别

后台页面输出明显比前台页面要复杂得多,主要是需要包含的页面和定义的常量要多很多,而且后台页面还需要判断角色的权限以及是否登录。

前台页面需要设置seo相关项目,内容页是写死的,其他页面都是通过后台的栏目设置,然后从文本缓存中读取出来的,而后台不用设置seo选项。

5. 关于数组的应用

在系统中大量运用了数组,特别是多维数组

首先,很多文本缓存都是用数组形式表现的

其次,很多字段也都是保存为数组的

再次,数组的运用非常广泛,比如查询出来的记录集,也被转成了数组,返回给页面,页面处理的就是数组,和数据库没有任何关系。

6. 面向对象的运用

封装了多个对象,这个是应该好好学习的

但是对数据类的封装比较简单,应该更加通用和抽象一点,比如把保存数据封装成一个方法,其他所有操作都调用这个方法,数据通过多维数组来传递。

四、模板引擎

1. 系统常量:系统自定义的常量,一般都是数组取文本缓存或者变量取Cookie

2. 标签:这里的标签实际上就是设置get函数的各个参数,包括获取数据的sql语句,对应的查询条件和自定义参数等,模板引擎的精华就在于此。get函数在编译成php文件的时候,会自动转换为tag函数

3. 模板:分为普通模板和标签模板,在标题上加以区分

4. 页面:该系统没有集中对页面进行管理,对页面没有一个明显清晰的概念。所有的模板都对应一个html页面,是模板源文件,然后再编译成php文件。

5. 页面的对应关系:是通过模型来对应页面的,模型就相当于一个模块,每个模块的前台页面模板不相同,比如新闻和产品。每个模型都有三种页面,栏目页、列表页和内容页。而栏目和模型是绑定的,这样每个栏目都有对应的模板。

6. 模板和标签的关系:模板是展示格式,标签是取数据。也就是说模板都是可见的,而标签都是和动态数据相关的,并没有明确的格式,只有和模板关联起来才会输出内容。

7. 好处

第一, 修改和保存模板都是通过文本文件,而不是通过数据库,可以大大提高速度,而且便于用ftp直接修改模板源文件。另外,还可以对模板文件分类,形成多套模板。

第二, 在模板中增加了逻辑语法,使得模板制作更加灵活简便

第三, 通过正则把模板源文件转换成符合PHP语法的动态页面,完全避免了字符替换中的复杂逻辑处理,把复杂业务都交给php文件来处理。

第四, 引入了风格,可以统一更换css

第五, 替换模板采用的是template标记,在编译的时候,会转换为include文件,就避免了模板的查找和替换。同时保证了页面的完整性,取代了框架的概念。

第六, 静态页的生成,都是通过入口动态页,把结果页面通过缓存取出来,再写入静态页面,节省了编译模板文件的步骤。

第七, 动态页还是静态页,是通过各个栏目来设置的,可以根据需要实现部分动态

第八, 标签的设置实现了可视化

第九, 样式表实现了统一设置,是通过文件路径参数化来实现,文件路径由皮肤路径和模块名组成,模块是一个比较好的概念,便于有效管理。

第十, 因为采用标准的php语法,数据库中的数据在模版中都是用字段数组的形式表现出来,替代了繁琐的标签设置。

8. 坏处

第一, 优化选项没有集中管理,不利于优化人员的工作。特别是内容页的优化选项,是写在动态页面中的,如果要做调整,必须要更改程序文件,而且不能针对各个模板设置不同的优化选项。可见,在设计框架时,根本就没有考虑内容页的优化,只是考虑了首页和各个栏目页的优化,这可能考虑到了内容页的优化大多数情况下不受重视。

第二, 对页面没有一个清晰的概念,更没有管理页面的功能,都是以模板页面的形式出现。

第三, 模板和标签的概念混淆,模板调用标签,标签又引用模板,这可能会让人弄不明白。而且模板没有明确的分类,只是用标题区分了普通模板和标签模板。

第四, 可以实现页面预览效果,但如果有参数的话,需要输出参数后才能预览,这就比较麻烦,为什么不能实现参数的自动填充呢。

第五, 从一个页面要修改相关模板,必须要点击三次鼠标,一是不直观不方便,二是速度会比较慢,效率比较低。另外,从一个模板中,无法找到调用或者引用它的页面情况。

第六, 无法实时生成静态页,而且不能统一生成静态页,没有实现一键生成,在生成页面的时候没有显示进度条。

第七, 不能实现共享标签,如果只是查询参数不同,就必须重新增加一个标签。不如getinfo函数方便,可以根据具体情况随意调用。当然getinfo函数不够直观,虽然也有可视化界面。

9. 综述

综上所述,该系统的模板引擎在架构上来说还是很大气的,特别是充分利用了PHP语言的特点,把模板文件编译成PHP页面,大大简化了模板引擎。另一方面,由于架构上的限制,只能局限于PHP语法的转换,而无法在转换过程中作更多的工作,在提高速度和开发效率的时候,同时降低了维护的效率和易用性。

五、缓存机制

1. 文本缓存:就是把数据库中的数据,写到文本上,前提是这些数据是固定不变的或者是不经常更新的。在文本上表现的是数组形式,通过cache_read函数返回include文件,再赋值给数组,实现从文本取数据,省略了读取数据库的步骤,大大提高了速度。

2. 静态缓存:和IE的缓存差不多,都有一个缓存周期,在这个周期之内,可以访问静态缓存,不用访问动态页面,提高访问速度。

静态缓存的生成过程:在访问php页面的时候,如果有缓存页面,并且没有失效,就输出静态缓存,否则,开辟一个缓存区域,把php页面输出的内容,写入到缓存页面。该页面的目录和名称是把页面的php文件名称,包括参数,用md5函数加密后得到的字符串。

判断缓存文件是否失效,根据时间戳,生成缓存的时间戳写在缓存页面的开始,输出缓存页面,并不是简单的载入或者包含,而是把时间戳后面的内容echo出来。

3. 压缩功能:需要开启gzip扩展,压缩功能可以减小页面的尺寸,提高访问速度,但对服务器的压力很大,需要有较好的服务器。

4. 好处

第一, 网络访问的瓶颈在数据库的读取上,尽量减少对数据库的读取工作,是缓存的核心任务

第二, 静态缓存在大访问量的时候,速度会有较大的提高,如果访问量不大,最好关闭静态缓存。