file_get_contents是否使用缓存?

时间:2013-08-07 07:40:52

标签: php file-io

我有一个函数可以生成一个包含DB内容的表。有些单元格有自定义HTML,我正在通过模板系统读取file_get_contents。

小内容相同,但此操作可能执行15次(我每页限制15个表行)。如果file_get_contents看到内容相同,那么它会缓存吗?

3 个答案:

答案 0 :(得分: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);
}

更新以前的if案例不正确,现在通过与当前时间进行比较来纠正。谢谢@Arrakeen。

答案 1 :(得分: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($ filename)只会从磁盘读取一次文件,后续调用将从函数中的静态变量中读取值。请注意,对于大型文件或每页仅使用一次的文件,您不应指望这种方法,因为静态变量使用的内存将持续到请求结束。在静态变量中不必要地保存文件内容是使脚本成为内存耗尽的好方法。

答案 2 :(得分:1)

正确答案是。所有PHP文件系统功能都执行其自身的缓存,并且您可以根据需要在PHP.ini中使用“ realpath_cache_size = 0”指令禁用缓存。默认的缓存超时为120秒。除非HTTP标头覆盖它,否则这与浏览器通常对所有GET请求(大多数Web访问)进行的缓存不同。在开发工作期间,缓存不是一个好主意,因为您的代码可能会从内容已更改的文件中读取旧数据。