关于本站缓存机制的说明

时间:2007-03-15 09:49:53      类别:Web技术|WEB Tech, Wordpress      本文链接:生活点滴Enjoy Life

最近有朋友对本站的缓存机制感兴趣,借此机会我再详细的描述一下,个人认为本站的缓存虽然不算完美,但也有部分值得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还有个需要解决的问题就是在缓存和及时性之间找到一个平衡点,这个平衡点我是这样把握的。

  1. 对于首页,我尽量生成HTML文件,因为如果简单的用Cache_Lite的话,由于wp自身的机制,还是需要查询数据库的,由于首页调用较多,所以这样效率还是没有发挥到极致,所以我用自己编写wp-plugin来实现这样的功能,当有新的文章发布、旧文章修改、删除的时候重构index.htm(因为在apache的服务器设计中一般默认首页的顺序都是HTML文件在先,所以如果生成了index.htm,网站被访问的时候,他将被优先调用)。
  2. 对于分类的页面,我将缓存的时间设置成2个小时,这样的话分类页面的缓存会每两小时自动更新。
  3. 具体文章的页面,我设置的缓存是无限长,更新机制和index.php一样,唯一不同的是我没有将其进一步静态化到HTML的状态,如果要想更一步提高效率,可以考虑这样做。如果这样做的话就是所谓的“全站静态化的方案”。当然这样必须配合url rewrite和php建立rewrite对应的文件夹和HTML文件来实现,比较复杂,由于本站的流量还没有到那个地步,所以不再考虑。
  4. 其他浏览者参与的页面就用ajax实现,如首页的最新评论和文章页面的评论

下面是相关的代码:
生成首页HTML文件和删除缓存的插件(是不是很简单呢?)

  1. < ?php
  2.  
  3. /*
  4. Plugin Name: cos-cache-clear
  5. Plugin URI: http://www.storyday.com
  6. Description: clear the relavent cache when a post created or modified with cosbeta's themecache
  7. Version: 1.0
  8. Author: jiangdong
  9. Author URI:http://www.storyday.com
  10. */
  11. function clearCosCache ($post_ID){
  12. define('THEME_CACHE_DIR',ABSPATH."/wp-content/themes/cosbeta/ThemeCache"); //this is the cache file  path
  13. define('PEAR_DIR',ABSPATH.'/lib/PEAR')//this is the pear path
  14. ini_set('include_path', PEAR_DIR . PATH_SEPARATOR . ini_get('include_path'));
  15.  if ( !class_exists('Cache_Lite')){
  16.  include  "Cache/Lite.php";
  17. }
  18. $options = array(
  19.     'cacheDir' => THEME_CACHE_DIR.'/cache/',
  20.         'hashedDirectoryLevel'=>2,
  21.         'lifeTime' => null,
  22.     'pearErrorMode' => CACHE_LITE_ERROR_DIE
  23. );
  24. $cache = new Cache_Lite($options);
  25. $post_url = get_permalink($post_ID);
  26. $host = "http://".$_SERVER["HTTP_HOST"];
  27. $start = strlen( $host );
  28. $end = strlen($post_url);
  29. $cache_single_id  = md5( substr($post_url, $start,$end)) ;//将cache id取出来
  30.  
  31.  if( $cache->get( $cache_single_id) ){
  32. //如果cache存在,则删除cache
  33.          $cache->remove($cache_single_id);
  34.         }
  35. // write the index html file
  36.  
  37. $http_file = "http://".$_SERVER["HTTP_HOST"]."/index.php" ;
  38.  
  39.         $handle = fopen ($http_file , "rb");
  40.         $contents = "";
  41.         while (!feof($handle)) {
  42.           $contents .= fread($handle, 8192);
  43.         }
  44.         fclose($handle);
  45. //write the file
  46.         $filename = ABSPATH.'index.html';
  47.  
  48.         // 首先我们要确定文件存在并且可写。
  49.         if (is_writable($filename)) {
  50.            if (!$handle = fopen($filename, 'w')) {
  51.                          echo "不能打开文件 $filename";
  52.                          exit;
  53.            }
  54.            @flock($handle ,LOCK_EX );
  55.  
  56.            // 将$somecontent写入到我们打开的文件中。
  57.            if (fwrite($handle, $contents) === FALSE) {
  58.                    echo "不能写入到文件 $filename";
  59.                    exit;
  60.            }
  61.            @flock($handle, LOCK_UN);
  62.  
  63.            fclose($handle);
  64.  
  65.         } else {
  66.            echo "文件 $filename 不可写";
  67.         }
  68.        
  69. }
  70.  
  71.  
  72.  
  73. add_action('publish_post', 'clearCosCache');
  74.  
  75. add_action('delete_post', 'clearCosCache');
  76.  
  77. ?>

另外您还可以参考我这篇文章:如何给wordpress增加缓存(本窗口打开)

该日志未加标签
发表于 2007-03-15 09:49:53 目录:Web技术|WEB Tech, Wordpress [RSS 2.0] 您可以评论. Pinging 不可用.
如果您喜欢本blog,欢迎你的feed订阅,谢谢你的支持

赶快占沙发

    还没有留言呢,等你发表高见,快抢沙发啊!
  • 转到第
(Required)
(Required, not published)
如果留言未显示请不要重复留言,我将为你恢复!


生活点滴Enjoy Life is proudly powered by WordPress | admin| About Us | cosbeta| Bluehost| site map 0.395s & 26