【问题标题】:Basics of PHP opcode cachePHP 操作码缓存基础知识
【发布时间】:2009-09-22 20:37:39
【问题描述】:

目前在一个非常大的项目中,我不打算将其重新用于另一个站点,我将站点的名称硬编码到所有文件中。现在,如果我要更改站点名称,那么在任何地方都需要付出很多努力。我知道显而易见的解决方案是将名称存储为变量或常量,但我想您可以将其称为我的微优化思维方式:我一直认为 PHP 需要解析的东西少了一件。我确实意识到这不会有太大区别,但我只是想知道使用像 APC 这样的操作码缓存是否意味着 PHP 甚至不必重新解析它?

【问题讨论】:

    标签: php optimization apc opcode-cache


    【解决方案1】:

    真的:你不应该关心这样的事情。

    配置上的任何差异都将意味着更多更多差异(例如,对于 APC,apc.stat 选项可能会对您的服务器负载产生相当大的影响——以及任何事情像您所做的数据库查询一样,影响会增加数百倍)

    在这里,可能重要的是可维护性:

    • 站点名称没有硬编码对您有什么好处(纳米优化除外)
    • 硬编码对您有什么好处(同样的例外)

    如果在任何一种情况下答案都是“否”,并且您的应用程序可以正常工作...好吧,这才是最重要的!


    如果您有时间花在这种小于微优化上,那么最好花在使用分析器检查您的应用程序代码,检查您的数据库查询,您正在执行的获取静态 JS/CSS 的 HTTP 请求的数量上/images,升级 PHP 或修改您的代码,使其可以在 PHP 5.3 上运行 (因为 PHP 5.3 对 5.2 进行了一些优化),...

    所有这些很可能会让你获得更高的收益;-)


    评论后编辑:

    基本上,当一个 PHP 文件被加载时:

    • 从磁盘读取文件
    • 已解析并编译为操作码
    • 操作码被执行

    使用操作码缓存:

    • 如果 RAM 中有一个位置包含操作码,这些操作码将从 RAM 加载(即,不读取文件,也不解析/编译)
      • 如果没有,请参见前面的步骤 -- 只需在执行前添加“将操作码存储到 RAM”,用于下一个请求
    • 并执行操作码

    apc.stat 选项定义 APC 是否应检查文件的最后修改日期/时间,以决定是使用 RAM 中的操作码,还是重新编译文件(如果该文件比 RAM 中的操作码更新)。

    禁用此选项意味着:

    • 文件不在磁盘上检查 => 更快,使用更少的资源
      • 例如,我发现在负载相当高的服务器上禁用此选项时,CPU 负载下降了 10% 到 15%
    • 但是由于没有检查修改,如果你想考虑修改,你必须清除缓存


    不过,我说的是真的:可能有很多可以优化的东西,这意味着比简单的“我应该使用硬编码值”还是“我应该使用常量/变量”更重要的收获”。

    【讨论】:

    • 谢谢我只是好奇,我可能应该阅读更多关于操作码缓存的工作原理
    【解决方案2】:

    这正是发生的事情......没有进入令牌级别的细节......

    PHP 是一种脚本语言,大多数人认为它没有被编译。虽然这在传统意义上是正确的,因为我们没有调用 gcc 或 javac;相反,我们每次请求脚本时都在编译。事实上,PHP 和 Java 的编译生命周期非常相似,因为它们都编译成中间指令集(操作码或字节码),然后在虚拟机(Zend VM 或 JVM)中运行。

    解析和编译阶段很慢。当我们添加一个 opcache 时,我们通过存储解析和编译阶段的结果来缩短这个过程,只让执行像往常一样动态运行。实际上,我们现在更接近 Java 生命周期了;主要区别在于我们保存到共享内存而不是文件,并且可以在脚本发生更改时自动重新编译。

    使用操作码缓存。与任何微优化相比,它会给您带来更多的性能提升。此外,在使用 Zend OpCache 时,为您做了很多优化(例如,在不使用返回值时将 $i++ 切换为 ++$i)。

    使用操作码缓存不再是可选的,它可以让您轻松地从硬件中获得更高的性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 2018-05-25
      • 2014-11-28
      • 2014-02-14
      • 2023-04-10
      相关资源
      最近更新 更多