CI缓存终极解决思路
本帖最后由 vps4 于 2009-5-23 11:53 编辑CI是直接用uri的MD5值来做缓存文件名
如果你直接这么用, 我认为是错误的!!!
应该使用method+参数值的MD5值做缓存文件名, 就不会存在缓存攻击问题, 这样能确保唯一性
看了你们讨论了这么久, 这么简单的问题怎么就说不清楚....
我自己写了一年多的CMS, 我是这么做我的缓存系统的
生成的缓存结构,应该像这样
cache/
posts/
a/
a23ce89c1a32d23ce89c1a32d23ce89c.txt
ab9cds2312d245233ce89c1a32d23ced.txt
b/
c/
lists/
searchs/
MD5值从哪来?
(a23ce89c1a32d23ce89c1a32d23ce89c.txt 这个MD5值是我随便打的, 生成这个MD5的不应该是URI, 而应该是在controller里指定的名称, 这样不但可以有效管理缓存群组, 而且也能保证唯一性)
为什么会有abc目录?
(这是为了性能考虑, 取MD5值第一位做第一层目录名, 如果文件巨多, 可以取第二位再分)
总结:
终极完美解决办法就是必须改CI的缓存类
以实现
$this->cache($cache_time, $cache_group, $cache_name);
使用方法应该像这样
$this->cache(3600, 'posts', '1');
一个完善的缓存系统, 一定要可以自定义缓存文件名
补充:
不好意思,昨天半夜比较晕,没有说到重点,我是拿出了CI的URI ,没有用route
帖点代码吧
switch ($uri->segment(1)) {
case 'page':
$page = intval($uri->segment(2));
$page = $page ? $page : 1;
// cache
if ( $cache_output->start($page, 'page', get_option('cache_list')) ) exit;
$perpage = get_option('list_num');
$startnum = $perpage * ($page - 1);
$sql = "SELECT SQL_CALC_FOUND_ROWS * FROM $db->posts WHERE 1=1 ORDER BY post_date DESC LIMIT $startnum, $perpage";
$main_posts = $gl->get($sql);
$total = $db->get_var('SELECT FOUND_ROWS()');
$pages = ceil($total / $perpage);
$uri_before = site_url('page/');
$uri_after = '/';
$tpl_name = 'index';
break;
}
$cache_output->end(); 先收藏了,以前也看到有人争论缓存的事情,也有不少解决方法,等用到时在一个个测试下,谢了{:3_56:} 大家只是讨论CI的cache的bug而已,如果说到解决方法,当然有很多了,不能说没有人想到你这种方法
如果我用cache,我自己控制,一个文章生成一个cache,一个list生成一个cache,一个首页生成一个cache,就像生成静态那样,不是更好吗?
你来这里这么久了,这么简单的道理也不懂? 还没用到CI的这块,有机会要好好看看 本帖最后由 vps4 于 2009-5-23 16:25 编辑
3# gdtv
你说的对, 就应该像生成HTML那样用缓存, 我没说没人想到我的办法,只是总结一下.可能标题误导你了?
PS.我的缓存分二部份, 一个$cache_output对像用于整页的输出, 一个$cache对像用于缓存数组这类的东西
CI自带的缓存我认为不应该用于生产环境. CMS都static HTML的 我十分同意这句话:"一个完善的缓存系统, 一定要可以自定义缓存文件名".... 这么好的文章我以前竟然没看到!转移到教程区! 这东西有点高级,我居然没看懂,看来是落后了,学习、学习,再学习! 嘻嘻,收藏。
页:
[1]
2