【问题标题】:Does reading include files slow down php script load?阅读包含文件会减慢 php 脚本的加载速度吗?
【发布时间】:2011-12-14 16:20:01
【问题描述】:

使用include 文件很常见。我认为在不考虑性能的情况下保持代码整洁是过度使用的。对于几个includes,磁盘应该读取文件,并且由于我们非常使用磁盘,这可能是一个缓慢的过程。但是,这不是主要的缓慢过程或限速过程,因为使用file_get_contents 加载文件要快几倍。

我认为这就是主要网站将 javascripts 放在 html 文件中而不是按文件加载它们的原因。或者,最好将一个大的 JS 文件拆分成几个小的 JS 文件,因为并行 http 请求可以更快地加载整个 JS 代码。但这和php文件不同,php脚本在这个过程中会一一读取include文件。

  1. 请评论这个问题有多严重?试想一个网页0.60s加载,10个php文件中的include能把它变成0.70s吗?

  2. 虽然这种影响应该可以忽略不计,但我想知道是否有加快此过程的方法。我不是指像APC 这样的php 缓存。

P.S.这个问题不是为了实际应用(典型案例),而是一般的理论考虑。

【问题讨论】:

  • 使用include 应该非常快,如果启用 APC 甚至更快。你在这里追错了。
  • 此外,由于连接处理开销,并行请求通常较慢。只需合并所有 JS 文件并将它们放在您的文档根目录中,然后让您的 Web 服务器 (Apache) 处理缓存。
  • 这可能非常严重...如果您使用的是 70 年代的机器:p 您需要 PHP 代码运行多“快”? 0.1s重要吗?与高度可重用、灵活和可扩展的架构相比,它有多糟糕?
  • 结合JS意味着需要更少的请求,从而允许其他文件填满并行下载队列(我认为限制一般为4个),但“分块”有一个优势(只组合起来限制,例如 20-100KiB):用户可以在所有代码下载之前运行一些代码。如果某人的连接速度很慢,并且您的网站在没有几个关键 JS 文件的情况下完全无法使用(在我看来这是一个糟糕的设计),他们会很高兴能够早点做某事。跨度>

标签: php file filesystems include


【解决方案1】:

include 及其同类是必需品。它与 Java 和 python 中的import 相似,用于类和函数定义。 include 应该非常快,但与不存在相比,使用它会延迟脚本执行。 includefile_get_contents() 完全不同。后者是一个函数而不是一个构造并返回一个字符串。 include 将实际执行包含文件的代码。

您关于拆分 JS 文件的说法是不正确的,因为从同一个域下载脚本会阻止并行下载,通常建议包含尽可能少的包含。

我非常怀疑拥有多个includes(假设所有这些都是必要的)会降低您页面的性能。如果您遇到性能问题,请查看其他地方。

如果你想加快 php,请考虑使用 php 编译器。

【讨论】:

  • 感谢您提供翔实的回答。我知道 include 和 file_get_contents 的区别。通过比较,我的意思是从磁盘读取文件可以更快;那么,限速步骤就是php处理include。
  • +1 用于引用 php 编译器。我一直对 php 编译器存有疑问(由于意见相反)。现在我必须尝试一下:)
【解决方案2】:

考虑一下:

(index.php)
for ($i=0; $i<100000; $i++) {
    include('somefile.php');
}

(somefile.php)
<?php
// nothing here

index.php 需要大约 115 秒(对我而言)来处理 100,000 次迭代,同时包含 somefile.php,即使 somefile.php 中没有任何内容。

但是:

(index.php)
for ($i=0; $i<100000; $i++) {
    // no file included this time
}

index.php 现在在没有 include() 构造的情况下需要 0.002 秒才能完成。

(index.php)
for ($i=0; $i<100000; $i++) {
    echo $i .'<br/>';
}

index.php 需要 0.02 秒来回显 $i 的 100,000 次迭代。

当然,由于大量迭代,这是一个非常极端的示例,但它确实表明,通过简单地包含一个包含构造,脚本执行时间可以成倍地延迟。下次您编写具有大量迭代的流程时,请考虑这一点,即。读取/写入大型 XML 文件等。最好保持代码内联,即使这意味着它不太“可管理”。因为你不仅通过包含一个 include() 在每 ~100,000 次迭代中增加 ~115 秒(~2 分钟)的脚本执行时间,而且还要考虑 include() (somefile.php) 是否有它自己的进程执行。我的示例只是添加了一个 include() 构造.. 包含的文件不包含任何内容。

现在,包括网页的文件,时间可以忽略不计。我只是指出 include() 构造确实需要额外的处理,无论其内容如何。

【讨论】:

  • 如果你把一个基于参数的函数放在 include 中并使用 include_once() 代替呢?
【解决方案3】:

是的,确实如此。你以前使用的库会因为下面的很多包含而带来性能损失。 提高性能的最佳方法是:

  1. 将所有包含的文件放在一个文件中
  2. 使用加速器

它可以将您的解决方案速度提高 22 倍。阅读更多Here

【讨论】:

    【解决方案4】:

    无论是在主 php 文件中还是在包含中,PHP 都必须解析代码。把它放在一个包含中可能没有什么区别。磁盘速度也没有区别,因为它会在第一次之后被缓存。

    【讨论】:

    • 不,文件由操作系统缓存(只是普通的磁盘缓存,PHP 文件很容易放入其中)。 APC 会缓存解析文件的结果。
    【解决方案5】:

    当然,包含文件可能会减慢 php 脚本的速度。有时您需要包含文件以阐明您的编码结构、架构和设计。但是有一些方法和解决方案可以提高包含更多包含的php脚本的速度。

    解决方案

    您可以使用以下方法加速您的脚本:

    • 更改您的编码架构并在需要时包含一些文件。
    • 使用 SSD 硬盘和足够的内存。
    • 在一个文件中添加所有包含。以我自己的方式,我在一个名为 engine.php 的文件中添加了包含文件,并且我通过路由器包含它来使用它。
    • 缓存数据是另一种防止数据包含在内的方法。
    • 由于reference,您可以更改编译器并使用比 php 5.x 快 10 倍的 php 7.x 编译器。一些基准测试 here 表明 php 7.2 也比 HHVM 编译器快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      相关资源
      最近更新 更多