PHP - file_exists 还是数组缓存?

Posted

技术标签:

【中文标题】PHP - file_exists 还是数组缓存?【英文标题】:PHP - file_exists or array cache? 【发布时间】:2011-02-22 11:23:27 【问题描述】:

我有一个 php 代码,其中包含多个文件(如果存在)。可能需要包含 150 个文件。

在这种情况下使用 file_exists 会很慢吗?我应该建立一个数组来创建文件结构的缓存吗?

还有其他方法可以对文件结构进行某种缓存吗?

【问题讨论】:

你能解释一下这些包含文件的来源吗?是上课吗?在这种情况下,一个由上帝编写的自动加载器可以帮助你,你真的需要包含所有这些文件吗?为什么你不确定他们在那里? 我有一种子主题,每个子主题都在它自己的文件夹中。某些文件可以默认存在,但并非必须存在。如果是,则应加载它们。 每个主题有多少个包含 PHP 或 html 代码的文件?为什么不将这些文件合并到一个模板中? 这是一个动态主题的实验,主题的某些部分可以在另一个主题中使用。因此,我将每个文件夹/部分分开非常严格。我可以将一些文件与 PHP 结合起来,我会的。 是 php 文件还是只是 HTML?如果它是用户定义的主题,我会在其中避免使用 php - 所以,不会使用包含。 【参考方案1】:

在处理单个请求期间有 150 个文件? 如果是这样,你必须减少这个数字,不是因为 150 个 file_exists 而是因为 150 个包含。

如果它取决于请求的参数并且每个请求是 3-4 就可以了。

您不能使用常规数组作为缓存。 PHP 不保留请求之间的变量。您不必发明这种缓存,而是重新考虑您的应用程序结构。

【讨论】:

好吧,我不完全同意,如果您查看一个真正的 Zend Framework 项目,可能会接近 150 个包含,但是在 apc 中使用 apc 和 require_once 优化设置可以使这些包含非常快。 @regilero,实际上它只包含少数文件。它使用自动加载器,所以当你请求一个类时。 Zend_Form_Element,自动加载器通过类名知道在文件系统上的哪里找到文件,然后才包含它。 @xzyfer:是的,但即使使用自动加载器,我看到的真实会计 ZF 项目的某些部分也会加载大量文件。在自动加载器后面使用 apc 确实有助于减少 IO 调用。【参考方案2】:

这是一个非常糟糕的主意。有两种经过验证的方法。

使用自动加载器在第一次实例化时动态解析类文件位置通常需要严格的文件夹结构(ala Zend Framework) 递归查找所有相关的类文件并生成一个缓存的类名索引到位置。所以在第一次实例化时,你有一个更简单的自动加载器,它查看缓存的索引并根据类名匹配文件的位置,然后包含它(ala Symfony1)

【讨论】:

【参考方案3】:

@include($file)

include 在尝试打开文件时会隐式检查文件是否存在。

以下每厘米:

这会关闭整个包含文件中的错误检查。 包含不存在的文件比包含存在的文件要慢一些,但比file_exists 检查慢得多。

【讨论】:

使用@ 抑制错误会对性能造成巨大影响。每个请求执行 150 次这将对服务器造成严重影响。 @Col,对于初学者来说,请查看 cmets,php.net/manual/en/language.operators.errorcontrol.php。许多类似的声明很容易通过简单的谷歌搜索找到。如果您真的怀疑其有效性,欢迎您自己尝试并将结果发布给我们其他人。 @aaz,请注意手册页上的大红色警告对话框。 “目前,“@”错误控制运算符前缀甚至会禁用将终止脚本执行的严重错误的错误报告。除其他外,这意味着如果您使用“@”来抑制某个函数的错误,或者它不是t 可用或输入错误,脚本将在那里死掉,不说明原因。” aaz,你正在把婴儿和洗澡水一起扔掉:为了抑制一种错误,你正在扼杀所有其他可能的错误消息。第二个“非常”将它与包含一起使用,这将关闭整个包含脚本中的错误 @xzyfer 好吧,您没有数字,但只是听到了一些谣言。纳夫说。只是一个友好的建议:不要那么毫无戒心。

以上是关于PHP - file_exists 还是数组缓存?的主要内容,如果未能解决你的问题,请参考以下文章

is_file和file_exists效率比较

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

file_exists 函数的 PHP 说明,它是检查实际文件还是仅检查路径

file_exists() 在 while 循环内的 php5 中不起作用

PHP缓存文件

清除缓存 if(file_exists)