PHP include(): 文件大小和性能

41

一个经验不足的 PHP 问题:

我有一个 PHP 脚本文件,需要在很多地方的很多页面中包含它。

我有两个选择:将被包含的文件拆分成几个较小的文件并根据需要引用它们……或者……将所有内容都放在一个单独的 PHP 文件中。

我想知道在这种情况下,使用较大还是较小的文件对 include() 的性能是否有影响?例如,200KB 文件和 20KB 文件之间是否存在任何性能差异?

谢谢。

3个回答

48

一个200KB和一个20KB的文件会有区别...但你很可能不会注意到: 200KB的文件并不是很大,而且在构建一个大型应用程序时,通常使用大量不是“小”的文件。

当你加载一个.php文件时,有两件事情需要时间:

  • PHP源代码被“编译”成“opcode”--这相当于JAVA字节码
    • 默认情况下,在每次包含PHP文件时都会执行此操作
    • 但是,使用一些像APC这样的opcode缓存,这些opcodes可以保存在内存中,这样编译过程就不必每次都执行--这非常好:它将意味着使用较少的CPU,因为编译将不再执行(只会偶尔执行一次)
  • 执行opcodes
    • 根据脚本包含的内容,这可能需要一些时间,也可能不需要:
    • 如果文件仅包含函数或类定义,则不需要花费太多时间:不会执行任何操作。
    • 如果文件包含指令,那么需要更多时间^^


顺便说一句:在一般情况下,优化SQL查询或添加一些缓存机制比考虑这种事情更能节省时间/CPU/资源。


感谢您提供的额外解释。 - Tom
2
即使使用了APC,也要考虑使用自定义的__autoload函数/spl_autoload_register - 我能够在自定义的MVC框架中仅包含调用类的模型文件,而不是所有模型文件的全局包含 - 这样每个文件的包含可以节省约1毫秒。因此,如果页面渲染需要80毫秒,并且即使使用APC(当有许多包含时)只包含所需内容可以节省20毫秒,那么这可能值得一试。而且只需要大约10分钟就可以实现。 - codercake

16
要小心使用include_once()(还有require_once()),它的运行成本比include()更高。每次运行include_once()时,PHP都会针对已包含文件的内部索引进行查找,然后决定是否加载该文件。索引中的包含文件越多,这种查找就越慢。 此外,在可能的情况下使用绝对路径来使用include()include_once(),因为这比相对路径要快得多,因为您不需要强制PHP为您计算绝对路径。 正如ggiroux所说,一些缓存技术,如APC将带来巨大的回报,并使担心您有多少include调用变得无关紧要(在很大程度上)(除非您有一些编写不良的代码)。
编辑 - 只有当您的代码库中有几千个requiresincludes时,才需要担心上述调用的问题。

在网络上,每100毫秒都很重要。你不需要成千上万的包含来从中获益。 - Pacerier
1
你认为这篇奇怪的帖子https://seeit.org/2010/06/11/php-the-include-include_once-performance-debate/如何?它声称**include_once()**比**include()**更快,你怎么看? - Adam
1
*_once 的好处是不会多次包含文件,这比检查多次要花费更长的时间。 - Mantriur

1

这肯定会产生影响,所以一定要使用include_once()而不是include()。您可以考虑使用具有包含缓存的APC。


ggiroux...谢谢...如果文件已经被缓存了怎么办?除非这是一个非常愚蠢的问题。 - Tom
1
如果它已被缓存,我会说它的影响非常小,因为它将以预编译的字节码形式存储在共享内存中。 - ggiroux
4
使用include_once()而不是include()?请详细说明;正如本主题已经提到的那样,出于速度考虑使用include_once并没有什么好处。 - Slavic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接