【问题标题】:PHP Opcode Caching/Zend Acceleration and include_once vs. require_oncePHP 操作码缓存/Zend 加速和 include_once 与 require_once
【发布时间】:2010-09-17 14:33:41
【问题描述】:

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

这对我们俩来说都有腥味,但我自己没有时间检查我们的基准方法,而且我的同事对鱼腥味的容忍度比我高。 :)

有没有人遇到过这样的事情?如果没有,是否有任何想法可能会导致通过从 include_once 切换到 require_once 来提高性能?

【问题讨论】:

    标签: php performance opcode zend-optimizer


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      所以他们实现这一点的方法是在所有可用路径中搜索文件,并检查它是否之前没有混合过等等。

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

      这已经不是这个星球上最快的过程,而且通常发生在 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 中的路径顺序也很重要。

      希望对您有所帮助。

      【讨论】:

      • “如果你有足够的质量保证”......你很有趣;)
      • 我刚刚在 100 次迭代循环中测试了 require() 与 require_once()。包含的文件定义了一个带有 1 个方法的小类。使用 require,父脚本需要 0.02 秒才能运行。使用 require_once,父脚本需要 0.005 秒才能运行。尽管如此,很少有脚本会包含足够多的文件以使其有所不同。基本上,这是我们需要担心的最后一个优化。
      猜你喜欢
      • 2012-07-08
      • 2011-08-06
      • 1970-01-01
      • 2014-03-15
      • 2011-06-16
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多