Loading...

关于本站缓存机制的说明

2007-03-15 09:49:53 发表于Wordpress, 网站技术 本文链接: 关于本站缓存机制的说明

最近有朋友对本站的缓存机制感兴趣,借此机会我再详细的描述一下,个人认为本站的缓存虽然不算完美,但也有部分值得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文件和删除缓存的插件(是不是很简单呢?)

< ?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
define('PEAR_DIR',ABSPATH.'/lib/PEAR'); //this is the pear path
ini_set('include_path', PEAR_DIR . PATH_SEPARATOR . ini_get('include_path'));
if ( !class_exists('Cache_Lite')){
include "Cache/Lite.php";
}
$options = array(
'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"];
$start = strlen( $host );
$end = strlen($post_url);
$cache_single_id = md5( substr($post_url, $start,$end)) ;//将cache id取出来

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" ;

$handle = fopen ($http_file , "rb");
$contents = "";
while (!feof($handle)) {
$contents .= fread($handle, 8192);
}
fclose($handle);
//write the file
$filename = ABSPATH.'index.html';

// 首先我们要确定文件存在并且可写。
if (is_writable($filename)) {
if (!$handle = fopen($filename, 'w')) {
echo "不能打开文件 $filename";
exit;
}
@flock($handle ,LOCK_EX );

// 将$somecontent写入到我们打开的文件中。
if (fwrite($handle, $contents) === FALSE) {
echo "不能写入到文件 $filename";
exit;
}
@flock($handle, LOCK_UN);

fclose($handle);

} else {
echo "文件 $filename 不可写";
}

}

add_action('publish_post', 'clearCosCache');

add_action('delete_post', 'clearCosCache');

?>

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

该日志未加标签
发表于 2007-03-15 09:49:53 目录:Wordpress, 网站技术 [RSS 2.0] 您可以评论. Pinging 不可用.
  • 相关阅读
  • homezz 美国专业主机商
    大师,指导指导如何? 拒绝低俗
      还没有留言呢,等你发表高见,快抢沙发啊!
    评论分页: 1
    (Required)
    (Required, not published)
    如果留言未显示无需重复留言,我将为你恢复!