2013-08-07 39 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($文件名)多次将只从磁盘中读取文件的单一时间,后续调用将从函数内的静态变量读取值。请注意,由于静态变量使用的内存将一直保留到请求结束,因此您不应该将此方法用于大型文件或每页仅使用一次的方法。将文件内容不必要地保存在静态变量中是使脚本成为内存管理器的好方法。