读取包含文件会减慢PHP脚本加载吗?

时间:2011-10-25 06:11:03

标签: php file filesystems include

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

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

  1. 请评论这个问题有多严重?想象一下,网页加载的时间为0.60秒,10个php文件中的include可以将其转换为0.70秒吗?

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

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

5 个答案:

答案 0 :(得分:16)

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

关于拆分JS文件的说法不正确,因为脚本从相同的域下载并行下载,并且通常建议尽可能少地包含这些文件。

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

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

答案 1 :(得分:6)

是的,确实如此。您以前使用的库会因下面的许多包含而导致性能下降。 提高性能的最佳方法是:

  1. 将所有包含的文件放在一个
  2. 使用加速器
  3. 它可以将您的解决方案加速22次。阅读更多Here

答案 2 :(得分:6)

考虑一下:

(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现在需要0.002秒才能完成而没有include()结构。

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

index.php需要0.02秒才能回复100,000次迭代的$ i。

当然,由于迭代次数很多,这是一个非常极端的例子,但它确实表明,通过简单地包含一个include构造,脚本执行时间可以按指数方式延迟。下次编写具有大量迭代的进程时,请考虑这一点,即。读/写大型XML文件等。最好保持代码内联,即使这意味着它不那么“易于管理”。因为只是通过包含一个include(),你不仅要在大约100,000次迭代中为脚本执行时间添加~115秒(~2分钟),还要考虑是否include()(somefile.php)有自己的进程执行。我的例子只是添加一个include()构造..包含的文件什么都没有。

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

答案 3 :(得分:4)

PHP必须解析代码,无论它是在主php文件还是包含中。将它放入包含可能没有任何区别。磁盘速度没有任何区别,因为它将在第一次之后缓存。

答案 4 :(得分:1)

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

解决方案

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

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