页面缓存存放不能按类名+方法组织文件夹的方式
数据库查询是可以这样缓存的一般情况下我们要缓存页面是因为涉及到数据库查询,比如:
class/method/par1/par2
其中par和par2可能有上百万种组合,但是生成的缓存文件都存放在cache目录下,如此多的文件,会不会IO很慢? 即使par和par2可能有上百万种组合
但是一段时间内,比如一星期下来可能只积累了几百个缓存文件(最常用 最热门的查询数量不会很多)
做一个定期的全部删除即可了
实在要重新组织文件夹,可能要修改后者扩展核心类库了 如果缓存文件过多,放在同一个文件夹当中,会影响IO处理效率,这是可以肯定的。这时我们通常会想到,如何实现文件缓存系统的“负载均衡” load balancing。也就是说将所有的缓存文件通过某种策略存放到不同的文件夹当中。
那么最容易想到和实现的就是对现有的Output类进行拓展。我这里有个思路:目前CI的默认缓存系统是把当前uri下的内容保存在文件中,而缓存文件的名称是uri的md5 hash。那么,可以在此基础上更进一步。按md5的首个字符(字母+数字)将缓存文件存放在不同的子文件夹下面。
请在这里查看原贴(下面是我转帖过来的内容):
修改 system/libraries/output.php - function _write_cache
$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
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,可以达到这样的效果:
没有修改缓存机制之前,缓存文件的列表举例:
cachedir/007dcd4f736e9be08adbe71f15e87bd9
cachedir/aee5f9543140bee532d3fe5e9b990e38
cachedir/a8cc3229af15a6259c33a5302884409f
cachedir/c5615a9a01e68d34682b2f7185bf5437
修改之后
cachedir/0/007dcd4f736e9be08adbe71f15e87bd9
cachedir/a/aee5f9543140bee532d3fe5e9b990e38
cachedir/a/a8cc3229af15a6259c33a5302884409f
cachedir/c/c5615a9a01e68d34682b2f7185bf5437
理论上讲,如果你的缓存文件足够多,比如10000个,它们讲会被分别保存在30+个子文件夹中。 楼上的,你在论坛贡献特别多,好几处都是你解决了我的问题。:handshake
我记得CI的缓存 似乎是个BUG,也就是它建立缓存的方式都是以 URI为参数建立的,这个时候 似乎存在问题
……呃,跟问题 没关系,而且修改的话就要动CI底层的缓存方案。算了,当我没说
页:
[1]