对于每一个学习PHP并运用此语言来做Web开发的PHPer来说,康盛创想这个公司的名字应该算是如雷贯耳吧。当我刚开始在学习
PHP的时候,就听说过Discuz这样一个开源BBS论坛程序。在学习PHP的过程中也听到很多PHPer前辈提到这样一个优秀的产品。
自己在很久以前就想要研究一下这个产品的源码,多多提高自己的程序能力。可是因为时间和自己能力问题,一直没有机会去下决心
研究此东西。现在正好5.1放假,有时间可以读读他们公司的源码了。。。果然,当自己认真去理解它程序的思想后,的确自己从中学习到
了很多经验。。。现在我就在此谈谈对康盛创想其中一个产品(SuperSite)的看法....
我这几天来,因为答应帮朋友做一个小的企业站。本来想用ZendFramework.可是考虑到可能有很多空间现在还不支持PHP5。所以自己
就转念不如自己运用一开源程序再结合自己更改的程序组合成一个小形的企业站CMS。这样以后要是还有朋友找我做站。我就可以运用
现成的程序。。。想到这里就开始研究SuperSite的实现机制。。
把Discuz,SuperSite,UCenter Home这三个产品下载下来组合在一起。。其实他们程序目录安排的方式大致相同,唯一不同的就是
Discuz不一样。。另外二个基本程序目录是一样的。比如说:模板,语言,管理员,附件文件夹都同一个方式。但是三个产品内部
程序实现方式是一个样子。例如:DZ的模板实现方式。看到这里,我就找到了与我想要做的CMS最为接近的东西,那就是
SuperSite!因为此产品刚开源不是很久。。所以呢。。我就决定看个东东。
通过了解,我最需要用到的是它内部的静态页与模板的实现方式。虽然以前也了解静态页实现的原理,但没有真真正正用过。所以呢
对于我来说是个学习与运用的机会。而对于它的模板实现方法,前时间有做过,就是把DZ模板与PHPCMS模板的实现方法,
写成了一个Zend Framework的View Helper运用到公司的项目中.所以这块不是什么难事。。。。
研究程序,最主要的是找到程序跑的整个流程。思路顺着程序走上几遍就可以知道程序的精华之处是如何实现。现在把我对SuperSite
的程序流程大致说一下。有不对的地方,请高手批评指正。谢谢。。
1.所有前台程序都有统一的入口文件,那就index.php。所有的程序接入都需要通过index.php. 这个index.php的作用类似于ZendFramework里的
Zend_Controller实现路由的功能。注:在index.php调用到一个common.php,这个文件是站点通用配置文件像连接数据库,取到Cache初始化文件
等功能.
2.程序通过index.php文件后,通过不同action的参数确定取不同的程序文件。如下面这程序片段:
<?php if($_SGET['action'] != 'index') { $scriptfile = S_ROOT.'./'.$_SGET['action'].'.php'; if(file_exists($scriptfile)) { include_once($scriptfile); exit(); } }
这里就是通过这种方式来实现取到不同程序文件。我理解类似于ZF的Controller的路由分发功能。
3。接下来程序会执行检测是否站点在此页需要生成静态页功能,当需要时,则初始化一些需要生成静态页的参数。
举例代码如下(基本说明在程序里):
<?php if(!empty($_SCONFIG['htmlindex'])) { $_SHTML['action'] = 'index'; $_SGLOBAL['htmlfile'] = gethtmlfile($_SHTML); //返回缓存存放位置与目录地址 /*Array ( [path] => ./html/index.html
[url] => http://127.0.0.1/enaiba/html/index.html ) */ ehtml('get', $_SCONFIG['htmlindextime']);//更新静态页时间 $_SCONFIG['debug'] = 0; }
4。程序根据需求调用不同的程序模板,并通过模板(template)函数编译模板文件。在template这个函数里主要运用到一个重要的
函数就是parse_template.这个函数的作用是通过正则表达式,把Html文件里我们所写的函数替换成我们所需要的代码。这点是比较
重要的。模板的功能在此环节实现,并产生效果。生成编译后的模板Cache文件。。
5。就是能过ob_start(),ob_get_contents(),ob_end_clean()这三个函数组合起来,取到缓冲区里输出的内容,并在此过程中把生成输出的
Html文件最后通过ehtml这个函数,生成静态页文件存放起来。在此函数里,当把所有的静态文件输出的最后,加入了一段JS。它的作
用是查找文件生成时间再与生成缓存时间相比较,如果超过缓存设置的最长时间,JS就会通过AJAX生成一个新的静态文件。这样就可以做到
当我们的缓存时间超期时。页面会通过用户的操作,而做出最快的更新。
6。最后,就是程序生成静态页面后,程序读取这个页就就OK!
SuperSite其中一个文件实现的大致流程如上所述。当然我只是理解冰山一角而已。。里面有很多需要去研究学习的函数与思想。
比如说里的模板语法block的实现过程,在Html里如何实现程序数据的取得。这都和block这个模板函数有关。希望有兴趣的朋友去研究哟!
有时间会整理一篇关于Discuz模板与ZendFramework结合起来用的文章。