目前在一个非常大的项目中,我不打算将其重新用于另一个站点,我将站点的名称硬编码到任何地方的文件中。现在,如果我要更改站点名称,那么在任何地方都需要付出很多努力。我知道显而易见的解决方案是将名称存储为变量或常量,但我想您可以将其称为我的微优化思维方式:我一直认为 PHP 需要解析的东西少了一件。我确实意识到这不会有太大的不同,但我只是想知道使用像 APC 这样的操作码缓存是否意味着 PHP 甚至不必重新解析它?
2 回答
真的:你不应该关心这样的事情。
配置上的任何差异都将意味着更大的差异(例如,apc.stat
APC 的选项可能会对您的服务器负载产生相当大的影响——而您所做的任何诸如数据库查询之类的事情都会产生数百倍的影响)
在这里,可能重要的是可维护性:
- 站点名称不被硬编码是否会给您带来任何好处(除了纳米优化之外) ?
- 硬编码(同样的例外)对您有什么好处吗?
如果在任何一种情况下答案都是“否”,并且您的应用程序可以正常工作......那么,这很重要!
如果您有时间花在这种小于微优化上,那么最好花在使用分析器检查您的应用程序代码,检查您的数据库查询,您正在执行的获取静态 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%
- 但由于没有检查修改,如果你想考虑修改,你必须清除缓存
尽管如此,我说的是真的:可能有很多事情可以优化,这意味着比简单的“我应该使用硬编码值”还是“我应该使用常量/变量”更重要的收获。
这正是发生的事情..没有进入令牌级别的细节......
PHP 是一种脚本语言,大多数人认为它没有被编译。虽然这在传统意义上是正确的,因为我们没有调用 gcc 或 javac;相反,我们每次请求脚本时都在编译。事实上,PHP 和 Java 的编译生命周期非常相似,因为它们都编译为中间指令集(操作码或字节码),然后在虚拟机(Zend VM 或 JVM)中运行。
解析和编译阶段很慢。当我们添加一个 opcache 时,我们通过存储解析和编译阶段的结果来缩短这个过程,只让执行像往常一样动态运行。实际上,我们现在更接近 Java 生命周期了;主要区别在于我们保存到共享内存而不是文件,并且可以在脚本发生更改时自动重新编译。
使用操作码缓存。与任何微优化相比,它会给您带来更多的性能提升。此外,在使用 Zend OpCache 时,为您做了很多优化(例如,在不使用返回值时将 $i++ 转换为 ++$i)。
使用操作码缓存不再是可选的,它将使您能够以很少的努力从硬件中获得更多的性能。