用户
 找回密码
 入住 CI 中国社区
搜索
查看: 14397|回复: 12
收起左侧

CI缓存终极解决思路

[复制链接]
发表于 2009-5-23 01:54:37 | 显示全部楼层 |阅读模式
本帖最后由 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();

评分

参与人数 1威望 +5 收起 理由
Hex + 5 精品文章

查看全部评分

发表于 2009-5-23 11:43:07 | 显示全部楼层
先收藏了,以前也看到有人争论缓存的事情,也有不少解决方法,等用到时在一个个测试下,谢了
发表于 2009-5-23 13:37:51 | 显示全部楼层
大家只是讨论CI的cache的bug而已,如果说到解决方法,当然有很多了,不能说没有人想到你这种方法
如果我用cache,我自己控制,一个文章生成一个cache,一个list生成一个cache,一个首页生成一个cache,就像生成静态那样,不是更好吗?
你来这里这么久了,这么简单的道理也不懂?
发表于 2009-5-23 14:17:04 | 显示全部楼层
还没用到CI的这块,有机会要好好看看
 楼主| 发表于 2009-5-23 16:23:15 | 显示全部楼层
本帖最后由 vps4 于 2009-5-23 16:25 编辑

3# gdtv

你说的对, 就应该像生成HTML那样用缓存, 我没说没人想到我的办法,只是总结一下.可能标题误导你了?
PS.我的缓存分二部份, 一个$cache_output对像用于整页的输出, 一个$cache对像用于缓存数组这类的东西

CI自带的缓存我认为不应该用于生产环境.
发表于 2009-5-23 21:53:45 | 显示全部楼层
CMS都static HTML的
发表于 2009-7-22 18:25:16 | 显示全部楼层
我十分同意这句话:"一个完善的缓存系统, 一定要可以自定义缓存文件名"....
发表于 2009-7-22 21:55:52 | 显示全部楼层
这么好的文章我以前竟然没看到!转移到教程区!
发表于 2009-7-23 16:22:03 | 显示全部楼层
这东西有点高级,我居然没看懂,看来是落后了,学习、学习,再学习!
发表于 2009-7-25 17:21:37 | 显示全部楼层
嘻嘻,收藏。

本版积分规则