scckfzx 发表于 2010-3-23 10:39:13

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

数据库查询是可以这样缓存的

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

zycbob 发表于 2010-3-23 14:33:34

即使par和par2可能有上百万种组合
但是一段时间内,比如一星期下来可能只积累了几百个缓存文件(最常用 最热门的查询数量不会很多)
做一个定期的全部删除即可了

实在要重新组织文件夹,可能要修改后者扩展核心类库了

saturn 发表于 2010-3-24 14:14:36

如果缓存文件过多,放在同一个文件夹当中,会影响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+个子文件夹中。

snllll 发表于 2010-4-11 04:17:46

楼上的,你在论坛贡献特别多,好几处都是你解决了我的问题。:handshake
我记得CI的缓存 似乎是个BUG,也就是它建立缓存的方式都是以 URI为参数建立的,这个时候 似乎存在问题
……呃,跟问题 没关系,而且修改的话就要动CI底层的缓存方案。算了,当我没说
页: [1]
查看完整版本: 页面缓存存放不能按类名+方法组织文件夹的方式