查找数千个文件中是否存在动态文件名

时间:2010-05-14 21:40:53

标签: php codeigniter

我正在用PHP编写缓存模块。它尝试使用$string+timestamp作为文件名编写缓存。

我写缓存没有问题。

问题是,我做了一个foreach循环来获取我想要的缓存。

这是我用来获取缓存的逻辑:

foreach ($filenames as $filename){ 
    if(strstr($filename,$cachename)){//if found 
        if(check_timestamp($filename,time()))
                          display_cace($filename);  
        break;
    } 
}

但是当它试图获取和读取缓存时,它会降低服务器速度。想象一下,我在一个文件夹中有10000个缓存文件,我需要检查该缓存文件夹中的每个文件。

换句话说,我用这种格式filename_timestamp编写缓存文件。例如:cache_function_random_news_191982899010./cache/文件夹中。

当我想获取缓存时,我只传递cache_function_random_news_并以递归方式检查该文件夹。 如果我在文件名上找到带有该针的东西,则显示它并中断。

但是递归检查文件夹中的10000个文件并不是件好事,对吧?

这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:2)

浏览器和Web服务器通过维护“索引”来解决缓存维护问题。您可以在文件(二进制文件/文本)或数据库中维护此索引。

例如:

  1. 每当您创建新的缓存文件时,请在表/文件中添加一行/条目。
  2. 然后只需使用表/文件快速搜索缓存文件存在
  3. 您还可以使用记录中的标记
  4. 标记不必要/过时的文件
  5. 然后定期(使用Cron作业或其他技术)删除过时的缓存文件。
  6. 这种方法将大大提高性能。

答案 1 :(得分:1)

不要将时间戳存储为文件名的一部分,而是以某种对您有意义的格式将缓存内容与缓存内容一起存储在文件中。例如:

档案/cache/cache_function_random_news

191982899010
stored content

文件的第一行包含时间戳,您可以在需要时阅读该时间戳,例如:定期清理缓存时该文件的其余部分包含缓存的内容。另一种可能性是使用序列化数组。无论哪种方式,这使得读取缓存变得微不足道:

if (file_exists('cache/cache_function_random_news')) ...

答案 2 :(得分:0)

function rpl_cache_get($cachename, $time=''){
    $ci=&get_instance();
    $ci->load->helper('directory');

    //getting the file in cache folder.
    if(is_file(BASEPATH.'cache/'.$cachename)){  
        //current time is less then the time cache expire
        //get the data.
        $f = fopen(BASEPATH.'cache/'.$cachename,"r");
        $content = fread($f,filesize(BASEPATH.'cache/'.$cachename)); 
        if ( ! preg_match("/(\d+TS--->)/", $content, $match))
        {
            return FALSE;
        }
        // Has the file expired? If so we'll delete it.
        if (time() >= trim(str_replace('TS--->', '', $match['1'])))
        {       
            @unlink(BASEPATH.'cache/'.$cachename);  

            log_message('debug', "Cache file has expired. File deleted");
            return FALSE;
        } 
        $content = str_replace($match['0'], '', $content); 
        fclose($f);

        return unserialize($content); 
    }

    return false;
}

这个缓存系统将html块保存到php序列化数组中。然后使用上面的函数读取它并反序列化它并返回htmls数组。 你只需要使用echo或print_r

显示它们
function rpl_cache_write(&$data,$name,$timelimit){  
    $timesecond = $timelimit * 60;
    $cache_timestamp = time() + $timesecond;

    $f = fopen(BASEPATH.'cache/'.$name,"w");
    if($f != FALSE){
        $content = $cache_timestamp.'TS--->'.serialize($data);      
        fwrite($f,$content,strlen($content));       
        fclose($f);

        return true;
    } else {
        //todo : throw error cannot write cache file
        //echo "cannot write cache";
    }
    return false;
}