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() 的缓存?的主要内容,如果未能解决你的问题,请参考以下文章
PHP -- 上传文件接口编写 及 iOS -- 端上传图片AF实现