2010-05-14 41 views
0

我正在用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个文件不是一件好事,对吗?

这样做的最好方法是什么?

回答

1

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

文件/cache/cache_function_random_news

191982899010 
stored content 

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

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

是的,这也是在codeigniter缓存系统上实现的。我也是这样做的。并且由于该系统在完成应用程序的99%之后实施,代码变得有点像黑客。 它没有显着减少内存使用量,但将计算时间减少到90%,因为它绕过了数据库。 – r4ccoon 2010-11-10 10:31:29

2

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

例如:

  1. 只要你创建一个新的缓存文件,添加一个行/条目表/文件。
  2. 就用表/文件快速搜索缓存文件存在
  3. 您还可以标记在记录中使用标志
  4. 然后定期(使用cron作业或其他技术)多余/过时的文件删除过时的缓存文件。

这种方法将大大提高性能。

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数组。 你只需要使用回声或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; 
} 
相关问题