摘要:内容管理系统(CMS)在各大商业站点和门户站点中扮演着重要的角色,是内容有效组织和快速发布极为重要的基础平台。目前主流的内容发布系统都使用静态页面进行内容发布,在咱们的实际使用过程当中咱们深切的感觉到静态内容发布存在着不少弊端,本文讨论全搜索目前正在使用的基于动态可缓存内容发布系统的考虑和实现。php
1、什么是内容管理系统?html
内容发布系统也即CMS,英文全称为:Content management system,用于对企业业务数据进行组织、管理和发布,这里的内容不只仅指文字内容,还包括图片、声音、视频、Flash等富媒体资源,CMS的应用极大的提升了站点的建设效率并下降了维护成本。目前市面上的CMS种类繁多,开源的内容管理系统主要有:前端
PHP:java
国内PHPCMS,VeryCMS,DeDeCMS,EmpireCMS,HBCMS数据库
国外:Mambo,Joomla!,XOOPS,Drupal后端
更多见:http://www.php-open.com/9.htm缓存
Java见http://www.open-open.com/39.htm服务器
ASP主要考察使用过风讯,对其它ASPCMS感兴趣的能够查看这篇文章运维
http://hi.baidu.com/liberty88/blog/item/56e147fbd8271a176c22eb0e.htmlmemcached
商业CMS主要有:方正翔宇CMS,北方网CMS和TRS WAS,其中方正翔宇CMS在媒体行业应用很是普遍,TRS在政府部门应用很是普遍,北方网CMS在一些媒体网站中也有些应用。
就目前的整体状况来看,开源类CMS和商业类CMS还存在很大的差距,商业CMS在工做流,权限控制,内容的编采发以及系统的性能,扩展和可维护性上已经很是成熟和完善;对比开源CMS,则在这些方面存在很大的差距。因为我的以为国外的CMS不太符合国人的使用习惯和国情,因此对他们研究的比较少也不太清楚他们在国内的应用状况,就国内的CMS而言目前也尚未看到较大规模应用的案例(若是有请告诉我),我透露几个目前已知的商业CMS内容发布系统的应用状况关键性能指标,最大数据量千万级,同时最高终端用户数500,发布时间1-2秒,每日更新1万-2万篇内容,相关内容自动更新。总之,开源CMS要走的路还长。
2、什么是动态可缓存的内容管理系统?
动态可缓存的内容管理系统是指前台页面动态解析执行而且动态解析执行的页面可被客户端和代理服务器进行缓存从而达到和生成静态页面一样的执行性能和效果的管理系统。
3、为何使用动态可缓存的内容管理系统?
第一节面提供的内容发布系统包括商业类CMS基本都是以生成静态页面的方式进行内容发布,咱们早期的系统也所有使用静态静态页面进行内容发布,在咱们的实际使用过程当中,生成静态页面的方式给咱们带来了不少麻烦,主要有下面几个问题:
一、在设计、开发上,使用静态页面进行发布,系统须要不少额外的设计和开发,以静态页面的方式进行发布,涉及到生成规则,更新规则,发布规则等方方面面的事务,特别是当系统对内容的发布和更新有苛刻的性能要求时,这些规则更是须要进行仔细的设计和权衡。使用静态页进行发布主要是考虑到系统的执行性能,我固然赞成静态页的执行性能是很高的,可是多数系统却远远大不到预想的访问量而引入了高度的系统复杂,也并不是是系统一开始就有巨大的访问量,我也不认同动态执行页面就没法承受大访问量的说法,其实我看到的大多数CMS中都没有对静态页的处理规则进行很好的设计,好比:常常是在后台撤销了内容发现原始html没有删除,内容依然能够访问或者一篇内容更新时,相关引用的内容没法作到关联更新;静态发布方式并非那样容易的,相反我以为动态发布更容易开发和维护。
二、在系统维护上,生成的静态页面会占用很大的磁盘空间,咱们全部的静态页面加起来应该有100-200个G了。这样庞大的数据量备份,恢复都是很麻烦的,无形之中给系统的运维工做增长了很大的难度,但实际上CMS有个显著的特色就是发布多,修改少,越早的数据越少被访问,应该说这100,200个G的数据中有99%以上的数据是有效期事后不多或再也没被访问过的,因此磁盘几乎是白白的被浪费了。
因此,在咱们的实际使用过程当中咱们更倾向于动态内容执行+多重cache的方式,新的系统中咱们是这样作的,最后完成的系统很是简单并在Squid的帮助下达到静态页面的执行性能。
4、如何实现动态可缓存的内容管理系统?
(可缓存的内容管理系统用户访问流程)
实现过程:
1. 全部前台页面使用URL rewrite重写成.html进行访问,方便搜索引擎收录。
2. WEB程序执行时,向Squid服务器发送Expires头,用于控制squid服务器的缓存时间。Expires用户设置Squid服务器和客户端的缓存时间。如:
PHP
php代码
header("Expires:" . gmdate("D, d M Y H:i:s", time() + 120). "GMT"); //缓存120秒
Java
java.text.SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); java.util.Calendar cal = Calendar.getInstance(new SimpleTimeZone(0, "GMT")); format.setCalendar(cal); java.util.Date expires = format.parse(format.format(new Date(System.currentTimeMillis() + 120 * 1000))); response.setHeader('Expires: ' + expires);
3. 配置Squid服务器指向源服务器,并配置ignore-reloa来忽略no-cache和reload请求以提高Squid的命中率。
4. 将最新最热的数据缓存到Memcached服务器,减小数据库的查询。
至此整个过程已经完成,早期系统的访问量通常比较小,这时候可直接将WEB服务器对外提供服务,因为CMS所管理内容发布快,修改少的特性,最新最热的内容都将在Memcached中命中;当访问量增长到必定程度的时候就能够在前端加上squid服务器,这样就实现了和静态页面同样的效果,同时也兼备了系统的可维护性和灵活性。咱们的全搜索首页,母婴频道,娱乐频道使用这种方法实现得到了很好的效果。
5、扩展
使用squid做为前端时,过时时间的设置就变得很是重要,若是设置得太长用户就很容易看到过时内容,若是设置得过短又下降了命中率不能有效发挥前端缓存的优点。那过时时间应该设置为多长比较合适呢?一般状况下首页的更新频道很高,内容页更新的频率较低,因此首页的过时时间应该设置得短一些,内容页能够设置的长一些。
新浪
新浪首页60秒过时,内容页120秒过时
搜狐
搜狐首页70秒过时,内容页120秒过时
163
163首页80秒过时,内容页120秒过时
通过测试成都全搜索的系统里首页设置60秒过时,内容页设置120秒过时,这样的设置通过长时间的运行没有收到任何编辑和用户的不良使用反馈,这样的设置使得每隔60秒钟首页去原始服务器执行一次;每隔120秒对内容页去原始服务器执行一次。因为后端使用memcached做为缓存,即便是突发流量也能够轻松自如的应对。
学习资料:
出处:http://www.cnblogs.com/codecrazy/archive/2010/10/15/1851933.html