缓存热点的动态页面

AKCMS使用动态方式(或伪静态方式)访问有很多优势:节省磁盘空间,便于管理等等。但是有一个重要的劣势是:每次访问都要查询数据库,速度比静态会慢一些。尤其是当访问量达到一定程度之后,问题会更加明显:服务器进程被大量占用,CPU占用达到100%,内存被吃尽,数据库提示连接数过多……

解决这种问题通常的做法就是生成静态,但是当文章数上万甚至更多的时候,大量的静态文件的管理也是很麻烦的一件事。如果既要保持动态访问便于管理,又要让访问速度加快,在流量大的时候不要拖慢系统,通常的做法就是把热点网页缓存起来。

已经有很多现成的系统级的软件可以做这件事,比如:squid等。他们的工作原理大概是这样:用户请求/article.php?id=123456发到squid,squid先看看用户设置这个网页是不是需要缓存。如果不需要,则通过article.php获得内容并返回。如果需要缓存,先检查是否缓存过,如果缓存过,则直接把缓存结果返回,如果没缓存过,则通过article.php获得内容返回,同时再存一份缓存。这样下一个用户再请求相同的地址就直接返回结果了,从而达到了加快页面打开速度和减轻系统压力的两个目标。

squid这种东西好是好,但是虚拟主机是没有这个软件的,也可以说99%的中小网站都无缘用这个办法解决热点动态内容的缓存问题。考虑到这种情况,我们在AKCMS 3.0中自身内置了一个类似squid的功能,也可以较好的完成页面缓存的工作。

具体使用方法是:在configs目录下新建一个forecached_urls.php的文件,文件内容是纯文本,可以用记事本等普通编辑器很方便的修改。内容格式是:

1 每个URL占一行,行与行之间用回车间隔
2 每行分为两部分,第一部分是URL中域名之后的部分,第二部分是缓存时间,单位是秒。两部分之间用Tab(键盘上Q左边那个东西)间隔。

保存之后立即生效,再次打开相同的地址就可以通过缓存直接出内容了。通过缓存出的页面的源代码的最后用注释的方式标明总耗时(如:<!--cached 0.001-->),一般情况下在1-3毫秒左右,效率很高。

要注意的是:

1 缓存不是万能的,缓存只能解决频繁访问URL的问题。也就是说,可以缓存热点,不能缓存长尾。
2 缓存是有代价的:
 a 缓存1个热点URL的结果是,这个热点URL的访问速度得到提升,但其他URL的访问速度都会变慢,虽然只是变慢微不足道的不到一毫秒的瞬间,但是毕竟也是变慢。
 b 缓存URL后,当这个内容更新了,缓存的数据不能及时更新,只能等它过期
 c 缓存URL会带来磁盘空间的占用
3 冷门内容缓存不但不能加快速度,还有可能拖慢速度