8

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

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

4

3 回答 3

7

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。

于 2013-08-07T07:44:17.333 回答
3

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

于 2013-12-25T00:30:54.800 回答
3

正确答案是肯定的。所有 PHP 文件系统函数都有自己的缓存,如果您愿意,可以使用 PHP.ini 中的“realpath_cache_size = 0”指令来禁用缓存。默认缓存超时为 120 秒。这与通常由浏览器为所有 GET 请求(大多数 Web 访问)完成的缓存是分开的,除非 HTTP 标头覆盖它。在开发工作期间缓存不是一个好主意,因为您的代码可能会从您已更改内容的文件中读取旧数据。

于 2018-12-07T01:43:55.573 回答