2013-08-07 37 views
5

我有一個函數可以從DB中生成一個包含內容的表。有些單元格具有自定義HTML,我正通過模板系統與file_get_contents一起閱讀。file_get_contents是否使用緩存?

小內容是相同的,但是這個動作可能執行了15次(我每頁有15個錶行的限制)。那麼,file_get_contents緩存如果它看到內容是相同的?

+7

簡短回答:No. – deceze

+0

file_get_contents基本上只是fopen,fread,fclose等的一個快捷方式 - 所以我想打開一個文件指針並將其緩存起來。 – Jimbo

+0

PHP中有文件讀取功能,我可以選擇'$ cache = true'? – silkfire

回答

4

file_get_contents()沒有緩存機制。但是,您可以使用編寫您自己的緩存機制。

這裏是一個草案:

$cache_file = 'content.cache'; 
if(file_exists($cache_file)) { 
    if(time() - filemtime($cache_file) > 86400) { 
    // too old , re-fetch 
    $cache = file_get_contents('YOUR FILE SOURCE'); 
    file_put_contents($cache_file, $cache); 
    } else { 
    // cache is still fresh 
    } 
} else { 
    // no cache, create one 
    $cache = file_get_contents('YOUR FILE SOURCE'); 
    file_put_contents($cache_file, $cache); 
} 

UPDATE以前if情況下不正確,現在通過比較當前時間糾正。謝謝@Arrakeen。

+2

PHP有一個名爲APC的緩存本地支持 - http://php.net/manual/en/book.apc.php –

+7

因此...你正在緩存文件的內容在文件中......?! ?! – deceze

+1

這實際上會讓它變慢。 – Gerry

2

就像@deceze說的,通常答案是否定的。然而,操作系統級別的緩存可能會緩存最近使用的文件以提高訪問速度,但我不會指望可用的文件。如果您想緩存每個請求多次讀取的文件,請考慮使用靜態變量作爲包裝函數中的緩存。

function my_file_read($filename) { 
    static $file_contents = array(); 
    if (!isset($file_contents[$filename])) { 
    $file_contents[$filename] = file_get_contents($filename); 
    } 
    return $file_contents[$filename]; 
} 

調用my_file_read($文件名)多次將只從磁盤中讀取文件的單一時間,後續調用將從函數內的靜態變量讀取值。請注意,由於靜態變量使用的內存將一直保留到請求結束,因此您不應該將此方法用於大型文件或每頁僅使用一次的方法。將文件內容不必要地保存在靜態變量中是使腳本成爲內存管理器的好方法。