前期做过几个站,都使用了自己写的类似kc的程序,.net开发,对于标签解释参照了一些kc的东西,但大部分机制都自己重写了,本想能够灵活的在伪静态和静态之间转换,由于购买服务器空间限制,现在只能放弃伪静态,改用静态了。近期临时写了一段代码,调用我的标签解释引擎生成静态html文件,但是从实际效果来看,速度不太理想,跟原版asp开发的kingcms相比,虽有提升,但是差距不大。
在kc用户群中,也有一大部分站长朋友抱怨kc生成速度慢。都在等待kc.php出世,想着php版能解决目前的一些问题,特别是速度问题。呵呵,俺不喜欢php,虽然也开发过一些php程序,不过俺还是喜欢微软的东西,哈哈哈。
跟朋友沟通中,了解到其他一些优秀的cms,比如dede,生成速度据说很快的,难道真的是php的优势?我认为不然,我感觉肯定人家的代码在架构上做了什么特殊处理,优化了生成速度。没时间研究他们的代码了,只有自己设计自己的优化方法。这两天尽考虑这问题了。
生成静态html文件速度慢,究其原因,无非有几点影响速度。数据库读写查询速度、标签代码分析解释、文件内容写入。
对于数据库读写速度,目前优化空间不太大了,原有代码已经特别注意了查询语句的优化。当然,如果用mssql替换access的话,速度也会有一定提高,但是购买的主机一般mssql不太好用,有诸多限制,暂可以不考虑这个问题。还有一点就是考虑使用数据库连接池机制,就是改变目前读写一次数据库就发起一个新的数据库链接,并及时关闭,这种操作方法也是微软提倡的,说是节省服务器资源,减少死锁什么的。但是我考虑是不是可以发起链接后在所有需要的查询都操作完毕,再关闭链接呢,这样是不是能节省掉很多链接数据库的时间呢,进一步,是不是可以在cms开始生成页面前,就发起n个数据库链接,供后面需要的地方使用呢?顺手写了个数据库连接池测试代码,经过测试发现,数据库使用长连接,并不能提高多少速度,效果不太明显,可能的确如微软所说,数据库链接在断开后实际上服务器并不真正断开而是缓存了,下个链接直接就可以使用缓存打开了,放弃这个想法......
标签代码分析解释优化,我的代码中,对模板文件中的标签提取,标签解释,使用了大量的正则表达式进行处理,大大提高了代码分析的灵活性。当然,正则表达式运行效率可以通过优化正则表达式代码提高,不过目前暂时不考虑这个问题吧,感觉这个影响还不太大,还不是目前影响我的生成静态页面速度的主要因素。
最后就是文件内容写入了,昨天朋友ash提到,说dede的速度快,应该是因为php在文件处理上有一定优势。呵呵,这个我就不发表意见了。不过我认为开发语言对于文件读写速度差别不太大,毕竟大家都是调用了操作系统提供的api进行处理的。
说了这么多,究竟怎么优化呢,从哪儿着手呢。。。。。。。
就从数据库读写和标签代码分析综合处理这块儿着手进行优化吧,静态文件的生成,首先要读取模板文件,然后分析模板中使用了哪些调用标签,然后解释标签并用处理后的html代码替换掉标签,当然,标签解释时会需要大量的数据库操作。在此过程中,由于模板上很多标签都是雷同或者相同,解释后的内容也是相同的。比如:可能栏目页面每页都会有相同的推荐文章标签调用块。目前是每生成一个栏目页面,就读取一次推荐文章填充该标签。那么可优化的地方就在这里了,能不能建立一个大的缓存,只在第一次遇到一个推荐文章调用块的时候,读取数据库生成该标签所需的html代码,然后生成后面的列表页的时候,如果遇到相同的推荐文章调用,就不用读写数据库解释代码了,直接拿缓存里的html代码块替换该标签就可以了,这样即节省了数据库读写,又省掉了标签的逻辑判断处理。一个页面省掉一些,如果10000个页面呢,会节省很多东东的操作的。同样,一个页面上会有很多相同的标签的,比如每个页面都会有一个相同的广告位,等等。。。
但是还要考虑的就是这些缓存内容如何判断是否跟目前标签相同、缓存内容放到哪儿(写文件还是放内存)、缓存内容生命周期多久(什么时候释放缓存呢)。
闲话就此打住,干活去,实践中去求证这些东西是否真的能提高静态页面生成速度。