其实早在以前我已经写过关于cache和cos-html-cache原理的文章了,但是还是有朋友有点迷糊,所以今天抽空再来篇图解cos-html-cache原理介绍,毕竟一图胜千言,希望通过这次介绍,大家能对这个插件的原理更加明白,这样安装过程出现问题之后也能更快的定位了,更快的解决了。
如左图,cos-html-cache插件是需要urlrewrite支持的,不幸的是这个条件已经将国内的70%的虚拟主机挡在门外了。下面介绍请求url的流程,当访问者请求一个网址的时候,如例子中的/html/y2007/1_demo.html,服务器首先会去相关的文件夹(/html/y2007/)下寻找文件(1_demo.html)是否存在,如果存在则直接将该文件发送给浏览者,否则则发送一个404文件未找到的错误给浏览者,但是如果你的服务器支持自定义htaccess,服务器则将利用wordpress设置好的urlrewrite规则,将请求定位到index.php,剩下的事情由index.php进行处理,这个时候如果你安装了cos-html-cache这个插件,index.php在输出html的同时就会启动缓存创建函数来创建缓存,如本例中,缓存函数将分析请求的url,如 http://storyday.com/html/y2007/1_demo.html,然后检查web根目录下的html文件夹是否存在,如不存在则创建之,同样的方式创建y2007文件夹,然后在文件夹中创建文件1_demo.html,将刚才的输出内容写入到这个缓存文件中,至此缓存建立完毕,这样下一次同样的网址被访问到的时候,web服务器将直接输出缓存文件,而不会去执行php,也不会去查询数据库,大大的提高的页面的在入速度,和WP-Cache不在同一量级。
那么这个缓存的更新机制是怎样的呢?由于wordpress完善的插件hook机制,使得在任何需要的地方我们都可以利用插件来操作wp,因此cos-html-cache在将缓存更新绑定在几个关键的操作上,他们是增加文章、修改文章、增加留言、修改留言、删除留言,因为一般的blog需要更新的事件无非也就是这几个,所以这这些事件发生的时候,cos-html-cache将会删除对应文章的缓存,该文章下一次被访问的时候就会再次被创建缓存。
批量更新,有朋友总希望恢复1.1版本的后台批量更新功能,其实2.0版本的批量删除缓存功能就是批量更新。批量删除的原理是:插件从数据库中获取所有文章的永久链接,然后根据链接分析缓存的路径,利用php删除对应缓存文件。这时候有人会说,那怎么没有更新呢?下次有人访问就自动更新了呀。想更新特定的文章缓存怎么办?管他什么特定的文章哦,需要更新的时候就批量删除缓存即可。我认为这是最优的方法,1.x的版本经常将bluehost搞得超标,这也是促使我将插件升级2.0的一个重要原因。
任何事物都是具有两面性的,如果你仅仅是blog,我强烈建议你用上这个插件,对于浏览者来说,速度和花哨的界面,多数人愿意选择前者。
一个台湾 mm测试的本插件运行数据 可以参考
顺祝明天的WordCamp2007 Beijing活动成功举办!
该日志未加标签
前5排已经被占据了 快抢好位置哦
可惜了,我那郁闷的空间。[r]可怜:)[/r]
使用了这个插件后,速度确实快了,但是问题也有,就是按月归档页面怎么显示不出来了,具体看:http://zhangyu.info/2007/09
这个怎么解决啊,难道只能停掉这个插件或者是把按月归档给丢掉??
希望能得到答复,谢谢!
[r]你的永久链接格式为什么要和归档的格式一致,你不能显示归档是很正常的,你看看我的永久链接格式吧,
建议你仔细阅读一下这篇原理介绍,然后看看自己post的链接格式,再看看自己归档的链接格式你就应该明白是什么原因了啊[/r]
【…至此缓存建立完毕,这样下一次同样的网址被访问到的时候,web服务器将直接输出缓存文件,而不会去执行php,也不会去查询数据库…】
假如html已创建,那么访问的时候是直接去读取该html文件呢,还是说需要用到index.php去处理那个html并输出?
这么说,只要被访问的html文件是真实存在的,那服务器就不会解析htaccess里面的规则了吗?
可好像htaccess的优先级高于其他文件啊
不知道htaccess有没有这样一种写法,就是判断一下访问的html文件是否存在,存在则不执行规则,否则执行重写规则
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
搜索了一阵才搞明白了,原来以上wordpress写在htaccess的代码已经就是这种功能了,如果判断到访问的文件(或目录)不存在,则把重写的任务交给index.php处理。之前还以为就算已经生产html,至少需要index.php去读一下那个文件的内容,只是避免了去查询数据库。现在终于理解了
RewriteCond %{REQUEST_FILENAME} !-f 的含义