用户
 找回密码
 入住 CI 中国社区
搜索
楼主: Hex
收起左侧

[讨论/交流] 关于 CI 缓存 Cache 的问题

[复制链接]
发表于 2009-10-29 16:48:26 | 显示全部楼层
本帖最后由 weidian01 于 2009-10-29 16:50 编辑

1.7.2 版 还有这个bug吗
 楼主| 发表于 2009-10-30 10:23:16 | 显示全部楼层
1.7.2 版 还有这个bug吗
weidian01 发表于 2009-10-29 16:48



    这不是 BUG,验证传进来的参数是不是有效 CI 是不可能替你做的。
发表于 2009-11-12 11:48:25 | 显示全部楼层
原帖:http://codeigniter.com/forums/viewthread/53238/

这个帖子是在 CI 英文官方找到的,提供了外置的缓存清理类库。原文如下:

The following Cache vulnerability
was not addressed by CI, so I developed this simple and (hopefully) effective cache wrapper library
翻译:以下CI缓存弱点并未得到CI官方的解决,所以我自己写了一个外置的简单而有效的类库

Its main purpose is relieving the developer from worrying aboutcleaning the cache directory (or writing extra code to decide whatshould or shouldn’t go to cache).  
翻译:该类库的主要目的是免除开发者清理缓存文件的工作(写额外的代码来决定什么该缓存什么不该缓存【ichun注:这个其实才是这个争论贴的关键之处。个人认为】)

Also it enables turning on/off the cache for the entire site using the config file
翻译:同时,你也可以用config文件来打开、关闭全站的缓存功能

The random clean factor idea was borrowed from the excellentCache_lite PEAR library. It helps keeping the avarage number of cachefiles under control, without traversing the cache directory andcounting the actual number of cache files (and hence, it is very fast).
翻译:这个随机清理的主意借鉴了出色的cache_lite PEAR库。它可以保持一个平均的可控的缓存文件数,而不用进入缓存目录并统计真实的缓存文件数字(另外,它的速度相当快。)【ichun注:代码我还没空看,事实上也不太懂。希望大牛们解读一下】

PHP复制代码
<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
 
/**
* Cache Library Class
*/

class Cacher
{
    var $_ci;
    var $_useCache;
    var $_cacheExpire;
    var $_cleanFactor;
 
    /**
     * Constructor
     *
     * @access    public
     */
   
    function Cacher()
    {
        $this->_ci =& get_instance();
        $this->_useCache = $this->_ci -> config -> item("use_cache");    
        $this->_cacheExpire= (int)$this->_ci -> config -> item("cache_expiration");        
        $this->_cleanFactor = (int)$this->_ci -> config -> item("cache_clean_factor");            
    }
 
    // --------------------------------------------------------------------
 
     /**
     * Cache the current page using CI cache
     * Clean the cache directory on every 'cache_clean_factor' writes on avarage
     * Warning: When the time comes, the cleaner will delete all files in the cache directory
     * @access    public
     * @return    void
     */
   
    function cachePage($expiration = 0)
    {
        if($this->_useCache != 'false')
        {
            if($expiration > 0)
                $this->_ci->output->cache($expiration);
            else
                $this->_ci->output->cache($this->_cacheExpire);
           
            if($this->_cleanFactor > 0)
            {
                if(mt_rand(1, $this->_cleanFactor) == 1)
                    $this->_clean();
            }
        }
    }
 
    // --------------------------------------------------------------------
 
    /**
     * Clean all cache in the cache dir
     *
     * @access    private
     * @return    number of cleaned files or false on error
     */
   
    function _clean()
    {
        $dir = $this->_ci->config->item('cache_path');
 
        if(!@is_dir($dir))
            return false;
 
        if( ! $fp = @opendir($dir))
            return false;
       
        $count = 0;
        $retVal = true;
       
        while ($file = @readdir($fp))
        {                
            $fullPath = $dir.$file;
           
            if(!@is_file($fullPath))
                continue;
               
            //Cache file names are 32 chars in size (because md5). Just extra caution
            if(@strlen($file) != 32)
                continue;
 
            if(@unlink($fullPath))
                $count++;            
            else
                $retVal = false;
               
        }
        closedir($fp)
        if($retVal)
            return $count;
        else
            return false;
 
    }    
}
?>
复制代码


请各位大牛看看,讨论一下用这个解决问题如何?当然,对于高手来说,可能会执着于研究问题的根源,但对新手来说,可能解决的方案会更好。既然vison提出的解决方案并没有得到一致的认可,那上面贴的国外高手的“以清理缓存的方式”来解决问题的手段是否可行?

评分

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

查看全部评分

发表于 2009-11-12 11:56:16 | 显示全部楼层
http://codeigniter.com/forums/viewthread/47240
另外,这个也许是最早注意到CI缓存弱点的人了(2006年提出)。我转帖的那个清理类库也是这个发现问题者提出来的
发表于 2009-11-12 12:04:59 | 显示全部楼层
补充。上面那个发现问题的贴,是一群很冷静的、客观的、文质彬彬的技客在讨论,与我们两年后的今天我们在争论的那个帖子的感觉完全不一样?我们落后吗?
 楼主| 发表于 2009-11-12 13:55:37 | 显示全部楼层
这个方案是很好的解决方法。
应该是一种折中的处理方式吧。
对于一般的网站来说足够。
发表于 2009-11-13 00:49:04 | 显示全部楼层
这个问题没有标准的解决方案,我在08年末才开始玩ci,发现问题就一起讨论嘛,别在那里含沙射影

国内的程序员水平是比国外落后,就像你发出这么简单的cache clean自己都看不懂一样道理

还有我的名字不叫vison,关于缓存的问题到此为止,锁了
发表于 2012-3-12 11:43:57 | 显示全部楼层
   mark
发表于 2012-4-10 19:07:32 | 显示全部楼层
看完果然很有收获 ~ 还没研究到 Cache,提前看到了Cache 攻击的问题上 有了很多新的感悟啊
发表于 2013-7-18 12:09:14 | 显示全部楼层
其实我个人真心觉得 ,关于爆盘问题,upload上传的时候,传的太多也可能爆盘啊。所以考虑的点还是要限制这个文件夹的大小。http://codeigniter.org.cn/forums ... amp;page=1#pid77561。。。但uploads超过了,可不能删除,而是应该 提醒开发者。

本版积分规则