2010-05-14 40 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; 
} 
相關問題