include() 是不是使用 file_exists() 的缓存?

Posted

技术标签:

【中文标题】include() 是不是使用 file_exists() 的缓存?【英文标题】:Does include() use file_exists()'s cache?include() 是否使用 file_exists() 的缓存? 【发布时间】:2012-12-10 02:05:31 【问题描述】:

问题很简单:当涉及到触摸磁盘时,这两个示例是否相等,或者场景#2 是否两次触摸磁盘?

场景 #1

include '/path/to/file.php';

场景 #2

if (file_exists('/path/to/file.php'))
    include '/path/to/file.php';

我知道场景#1 触及磁盘一次。现在,据我了解,file_exists() 缓存路径以及文件是否存在。为了清除缓存,您需要调用clearstatcache()

但是include 等人也使用该缓存吗?还是file_exists()独有的?

【问题讨论】:

你不应该关心这个。 file_exists 将发出stat。与读取整个文件的 I/O 负载相比,stat 相形见绌。听起来您正在尝试执行微优化。如果您真的想加快速度,请使用 xdebug 或 xhprof 分析您的代码。 我要补充一点,如果你真的想要一个文件而不是目录,最好使用is_file()。不管上述评论如何,我认为这是一个公平的问题 - 但不是出于“优化”的原因。 所以你问这个问题。我要做的第一件事是查看 PHP 源代码。你试过吗? lxr.php.net - 另见:php.net/sites.php - 您可以做的另一件事是使用 strace 运行 PHP 并查看发生了什么。 @Charles 我分析了我所有的代码,这就是我问这个问题的原因。自动加载类出现在我的分析中,这就是我问这个的原因。数据库调用等应该占据分析的最大份额,但事实并非如此。我知道自动加载很慢,几乎按照定义,但如果我能加快一点速度,那将是值得的。 只有在某些情况下,将is_file()/file_exists()include 结合起来才有意义...自动加载类不是其中之一,除非我在这里遗漏了一些东西。 include 只会默默地失败,那么为什么要先检查文件是否存在呢?你的问题似乎被你问它的理由淡化了。 【参考方案1】:

只需要提醒一点:include 使用包含路径。 file_exists 没有。除此之外,您显然是在寻找问题而不是解决方案(这一定没有错,只是说,我的答案可能无法满足您的要求,仅涵盖片段)。

【讨论】:

...而 OP 在编写此问题时可能已经运行该代码 1,000,000 次。 :) @IanAtkin:更多次。它很快,即使是磁盘 I/O :) @IanAtkin:哦,你更新了。好吧,既然那么,再加上两到三个零,如果不是更多的话...... gg【参考方案2】:

这两个例子都接触了磁盘两次——读取目录,然后读取文件。在第一个示例中,这两者都发生在一个命令期间,第二个命令将它们拆分。 include() 不太可能再次读取目录,因为您的操作系统应该包含某种 HD 缓存,至少应该持续这么长时间。

但您显然是在尝试过度优化某些东西。除非您在脚本中执行 > 100 次,否则您的两个选项之间不会有任何性能差异。

【讨论】:

我可能会这样做 100 多次。它用于自动加载类,我不能总是确定会加载多少类。 @SverriM.Olsen:file_exists() 电话的意义何在? @WesleyMurch 主要是为了加快代码速度。触摸磁盘是出了名的慢,所以我宁愿避免它。请不要告诉我这不值得担心。那里的大多数 PHP 软件都非常缓慢,因为没有人关心这样的事情。当您在共享主机上安装 PHP 框架或类似框架,并且您有 100 多个用户时,它几乎无法使用。 @SverriM.Olsen:所以您得出结论,首先检查文件是否存在比盲目尝试include 更快?这不是破坏你的问题的重点吗?我不是要告诉你性能无关紧要,我只是想弄明白你的问题。 @WesleyMurch 对不起。我一定误解了这个问题。检查文件是否存在显然会增加另一个函数调用,这会使其变慢。 file_exists() 的重点更多是让我可以捕获不存在的文件并对其进行处理,例如记录它或显示适合环境(即开发、生产等)的错误消息。然而,此时我最关心的是性能。

以上是关于include() 是不是使用 file_exists() 的缓存?的主要内容,如果未能解决你的问题,请参考以下文章

SaltStack常用模块之file和mysqllvs

SaltStack常用模块之file和mysqllvs

PHP -- 上传文件接口编写 及 iOS -- 端上传图片AF实现

include() 是不是使用 file_exists() 的缓存?

php如何判断include是不是成功

为啥我们使用 `#include "stdafx.h"` 而不是 `#include <stdafx.h>`?