7

我有一位同事正在研究我们基于 PHP 的应用程序的操作码缓存/Zend 加速(我一直认为这些是同一件事)。他的基准测试似乎表明,如果我们将(大型)类库包含在 require_once 中,我们并没有看到性能优势,但我们确实看到了使用 include_once 时的性能优势。

这对我们俩来说都很腥,但我没有时间亲自检查我们的基准方法,我的同事比我更能容忍鱼的气味。:)

有没有人遇到过这样的事情?如果没有,对可能通过从 include_once 切换到 require_once 导致性能提高的其他事情有什么想法?

4

2 回答 2

12

对于初学者,这两个调用(require_once 和 include_once)都会仔细检查一个文件是否之前没有被包含过。

因此,他们实现这一目标的方法是在所有可用路径中搜索文件,并从本质上检查它是否之前没有混合过等等。

在后台发生的事情是他们评估所有不同的选项(例如多个包含路径等),然后通过从这个缩写形式创建真实路径,他们创建一个唯一标识符只有一条相同的路径——不是两条。

这已经不是这个星球上最快的过程,并且通常发生在 PHP 的每个请求上。然后添加另一个昂贵的操作,即 stat 创建我称之为realpath的内容(realpath,因为它是realpath()所做的)来检查文件是否存在。

如果我错了,请纠正我,但 APC 特别针对这种情况进行了优化。

所以无论如何-现在谈谈require_once和include_once之间的区别,这是require_once在包含文件时评估文件(对于低级解析错误等)。这是一个额外的检查,如果你有足够的质量保证,解析错误永远不会潜入包含中,你可以摆脱它。

否则很难找到。:-)

(需要考虑的一点:您可以使用 require_once 进行开发,并在部署时将所有调用替换为 include_once。)

至于操作码缓存 - 我推荐APC。之前在stackoverflow上已经讨论过了。就个人而言,我/我们正在使用它一段时间(我们每天处理大约 10 万访问者,有 3 个前端和 1 个后端),我们非常高兴。APC 还针对 require_once/include_once 进行了优化。

一个非常酷的副作用是 APC 还允许您将 PHP 变量存储在内存中 - 某种持久性等。

几个额外的指针:

  1. 很多人声称可以使用__autoload加速任何应用程序。
  2. 使用操作码缓存,避免有条件的 require_once/include_once(例如在循环或控制流中)。
  3. 有人说include_或require_once中的/absolute/path/to/file.php比依赖include_path要快。
  4. include_path 中路径的顺序也很重要。

希望有帮助。

于 2008-10-17T00:18:50.657 回答
0

我不能保证任何事情,因为我没有深入研究它,但是是的,我已经看到了两者之间的速度差异。不过,它们对我来说从来都不够重要,无法转移到 include_once 而不是 require_once 。

我一直认为差异是因为 require_once 必须在水下做更多的工作。至少还有一个潜在的错误需要准备和处理,当所需的文件不存在时还有很多工作要做。

于 2008-10-16T19:08:40.487 回答