| 
 | 
 
 
发表于 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+个子文件夹中。 |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |