【问题标题】:How to write file checking code for best performance如何编写文件检查代码以获得最佳性能
【发布时间】:2021-11-27 08:32:28
【问题描述】:

就低流量网站的速度而言,以下代码 sn-ps 之间是否存在明显差异?

$html = file_get_contents('cache/foo.html');

if ($html) {
    echo $html;
    exit;
}

或者这个:

$file = 'cache/foo.html';

if (file_exists($file)) {
    echo file_get_contents($file);
    exit;
}

在第一个 sn-p 中,只有一个对 file_get_contents() 的调用,而在第二个中,还有一个对 file_exists() 的调用。该页面确实涉及数据库访问 - 这种缓存将完全避免这种情况。

【问题讨论】:

  • 带有 file_exists 的会稍微慢一些,但应该不会很重要。 (原因:它又做了一步:验证文件确实存在)
  • 好问题! ,过去两周我一直在问自己这个问题

标签: php file


【解决方案1】:

在低流量的网站上速度会明显变慢;但是,如果您要获取内容是否存在,则无论如何都没有理由执行该检查,因为file_get_contents() 已经在幕后执行了该检查,如果文件不存在则返回false

您甚至可以直接在条件中调用file_get_contents()


if ($html = file_get_contents('cache/foo.html')) {
    echo $html;
    exit;
}

【讨论】:

  • 当心任何导致虚假值的文件内容,例如空字符串或字符串“0”。如果通过使用 if (false !== ($html = file_get_contents('cache/foo.html')) 明确检查 false,您可以执行内联
【解决方案2】:

两种变体的运行时差异是如此之小,以至于在实践中并不重要。 如果文件存在,第一个变体会稍微快一些。如果文件不存在,则第二种变体更快。 这两种解决方案的性能都不是最好的,因为在使用 echo 完成输出之前,首先将整个 HTML 加载到内存中。更好的是:

$ok = @readfile ('cache/foo.html');

使用 readfile 直接输出文件或不走弯路。如果文件不存在,@ 运算符将禁止显示警告。 $ok 包含输出成功的字节数,如果文件不存在则为 false。

【讨论】:

  • 这个真的很好
猜你喜欢
  • 2019-02-26
  • 2019-11-24
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多