最近有朋友对本站的缓存机制感兴趣,借此机会我再详细的描述一下,个人认为本站的缓存虽然不算完美,但也有部分值得php爱好者和wordpress爱好者借鉴的地方,呵呵,别扔鸡蛋,鸡蛋几毛钱一个呢。
介绍cache之前首先要对wordpress的模板结构做个简单的介绍,也要对PEAR这个强大的php库做个简单的介绍,希望初学php的朋友不要被他吓倒。
Wordpress整个模板最重要的几个文件分别是index.php、category.php、single.php这三个,index.php当然不用说了,首页的重要文件;category.php是分类下的blog文件列表的文件;single.php则是单个文章的模板,详细介绍请参考wordpress官方网站的这个地址:http://codex.wordpress.org/Template_Hierarchy(新窗口),也可以参考我这篇文章:http://www.storyday.com/web-tech/260/wordpress-theme-tips(新窗口)
PEAR是什么?PEAR是一个强大的PHP库,我们可以在他的基础上开发php程序,当然你想自己写库也可以,但是没有必要,应该尽量避免“单独重复发明轮子”,本站的cache重点借用了PEAR中的Cache_Lite来实现缓存,关于Cache_Lite的介绍,可以参考这里:http://pear.php.net/package/Cache_Lite/(新窗口)
Cache还有个需要解决的问题就是在缓存和及时性之间找到一个平衡点,这个平衡点我是这样把握的。
- 对于首页,我尽量生成HTML文件,因为如果简单的用Cache_Lite的话,由于wp自身的机制,还是需要查询数据库的,由于首页调用较多,所以这样效率还是没有发挥到极致,所以我用自己编写wp-plugin来实现这样的功能,当有新的文章发布、旧文章修改、删除的时候重构index.htm(因为在apache的服务器设计中一般默认首页的顺序都是HTML文件在先,所以如果生成了index.htm,网站被访问的时候,他将被优先调用)。
- 对于分类的页面,我将缓存的时间设置成2个小时,这样的话分类页面的缓存会每两小时自动更新。
- 具体文章的页面,我设置的缓存是无限长,更新机制和index.php一样,唯一不同的是我没有将其进一步静态化到HTML的状态,如果要想更一步提高效率,可以考虑这样做。如果这样做的话就是所谓的“全站静态化的方案”。当然这样必须配合url rewrite和php建立rewrite对应的文件夹和HTML文件来实现,比较复杂,由于本站的流量还没有到那个地步,所以不再考虑。
- 其他浏览者参与的页面就用ajax实现,如首页的最新评论和文章页面的评论
下面是相关的代码:
生成首页HTML文件和删除缓存的插件(是不是很简单呢?)
- < ?php
- /*
- Plugin Name: cos-cache-clear
- Plugin URI: http://www.storyday.com
- Description: clear the relavent cache when a post created or modified with cosbeta's themecache
- Version: 1.0
- Author: jiangdong
- Author URI:http://www.storyday.com
- */
- function clearCosCache ($post_ID){
- define('THEME_CACHE_DIR',ABSPATH."/wp-content/themes/cosbeta/ThemeCache"); //this is the cache file path
- include "Cache/Lite.php";
- }
- 'cacheDir' => THEME_CACHE_DIR.'/cache/',
- 'hashedDirectoryLevel'=>2,
- 'lifeTime' => null,
- 'pearErrorMode' => CACHE_LITE_ERROR_DIE
- );
- $cache = new Cache_Lite($options);
- $post_url = get_permalink($post_ID);
- $host = "http://".$_SERVER["HTTP_HOST"];
- if( $cache->get( $cache_single_id) ){
- //如果cache存在,则删除cache
- $cache->remove($cache_single_id);
- }
- // write the index html file
- $http_file = "http://".$_SERVER["HTTP_HOST"]."/index.php" ;
- $contents = "";
- }
- //write the file
- $filename = ABSPATH.'index.html';
- // 首先我们要确定文件存在并且可写。
- echo "不能打开文件 $filename";
- exit;
- }
- // 将$somecontent写入到我们打开的文件中。
- echo "不能写入到文件 $filename";
- exit;
- }
- } else {
- echo "文件 $filename 不可写";
- }
- }
- add_action('publish_post', 'clearCosCache');
- add_action('delete_post', 'clearCosCache');
- ?>
另外您还可以参考我这篇文章:如何给wordpress增加缓存(本窗口打开)

赶快占沙发