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