2

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

4

2 回答 2

6

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

配置上的任何差异都将意味着更大的差异(例如,apc.statAPC 的选项可能会对您的服务器负载产生相当大的影响——而您所做的任何诸如数据库查询之类的事情都会产生数百倍的影响)

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

  • 站点名称不被硬编码是否会给您带来任何好处(除了纳米优化之外) ?
  • 硬编码(同样的例外)对您有什么好处吗?

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


如果您有时间花在这种小于微优化上,那么最好花在使用分析器检查您的应用程序代码,检查您的数据库查询,您正在执行的获取静态 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%
  • 但由于没有检查修改,如果你想考虑修改,你必须清除缓存


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

于 2009-09-22T20:43:41.830 回答
3

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

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

在此处输入图像描述

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

在此处输入图像描述

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

使用操作码缓存不再是可选的,它将使您能够以很少的努力从硬件中获得更多的性能。

于 2014-05-09T13:37:42.893 回答