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

[视图] 页面缓存存放不能按类名+方法组织文件夹的方式

[复制链接]
发表于 2010-3-23 10:39:13 | 显示全部楼层 |阅读模式
数据库查询是可以这样缓存的

一般情况下我们要缓存页面是因为涉及到数据库查询,比如:
class/method/par1/par2
其中par和par2可能有上百万种组合,但是生成的缓存文件都存放在cache目录下,如此多的文件,会不会IO很慢?

评分

参与人数 1威望 +2 收起 理由
saturn + 2 touch the core of CI

查看全部评分

发表于 2010-3-23 14:33:34 | 显示全部楼层
即使par和par2可能有上百万种组合
但是一段时间内,比如一星期下来可能只积累了几百个缓存文件(最常用 最热门的查询数量不会很多)
做一个定期的全部删除即可了

实在要重新组织文件夹,可能要修改后者扩展核心类库了
发表于 2010-3-24 14:14:36 | 显示全部楼层
如果缓存文件过多,放在同一个文件夹当中,会影响IO处理效率,这是可以肯定的。这时我们通常会想到,如何实现文件缓存系统的“负载均衡” load balancing。也就是说将所有的缓存文件通过某种策略存放到不同的文件夹当中。

那么最容易想到和实现的就是对现有的Output类进行拓展。我这里有个思路:目前CI的默认缓存系统是把当前uri下的内容保存在文件中,而缓存文件的名称是uri的md5 hash。那么,可以在此基础上更进一步。按md5的首个字符(字母+数字)将缓存文件存放在不同的子文件夹下面。

请在这里查看原贴(下面是我转帖过来的内容):

修改 system/libraries/output.php - function _write_cache

PHP复制代码
 
$uri =    $CI->config->item('base_url').
                $CI->config->item('index_page').
                $CI->uri->uri_string();
 
        // Chalda here: cache in subdirectory
        $md5 =  md5($uri);
        $cache_path.= substr($md5, 0,1).'/';
        if ( ! is_dir($cache_path)){
            mkdir($cache_path);
        }
        $cache_path.=$md5;
        // end cache in subdirectory
 
        if ( ! $fp = @fopen($cache_path, FOPEN_WRITE_CREATE_DESTRUCTIVE))
        {
            log_message('error', "Unable to write cache file: ".$cache_path);
            return;
        }
 
复制代码


然后修改 system/libraries/output.php - function _display_cache

PHP复制代码
 
if ( ! is_dir($cache_path) OR ! is_really_writable($cache_path))
        {
            return FALSE;
        }
 
        // Chalda here: cache in subdirectory
        $md5 = md5($uri);
        $cache_path.= substr($md5, 0,1).'/';
        if ( ! is_dir($cache_path)){
            return FALSE;
        }
        // end cache in subdirectory
 
        $filepath = $cache_path.md5($uri);
 
复制代码


通过这样的hack,可以达到这样的效果:

没有修改缓存机制之前,缓存文件的列表举例:
PHP复制代码
 
cachedir/007dcd4f736e9be08adbe71f15e87bd9
cachedir/aee5f9543140bee532d3fe5e9b990e38
cachedir/a8cc3229af15a6259c33a5302884409f
cachedir/c5615a9a01e68d34682b2f7185bf5437
 
复制代码


修改之后

PHP复制代码
 
cachedir/0/007dcd4f736e9be08adbe71f15e87bd9
cachedir/a/aee5f9543140bee532d3fe5e9b990e38
cachedir/a/a8cc3229af15a6259c33a5302884409f
cachedir/c/c5615a9a01e68d34682b2f7185bf5437
 
复制代码


理论上讲,如果你的缓存文件足够多,比如10000个,它们讲会被分别保存在30+个子文件夹中。

评分

参与人数 1威望 +5 收起 理由
Hex + 5 我很赞同

查看全部评分

发表于 2010-4-11 04:17:46 | 显示全部楼层
楼上的,你在论坛贡献特别多,好几处都是你解决了我的问题。
我记得CI的缓存 似乎是个BUG,也就是它建立缓存的方式都是以 URI为参数建立的,这个时候 似乎存在问题
……呃,跟问题 没关系,而且修改的话就要动CI底层的缓存方案。算了,当我没说

本版积分规则