PHP操作码缓存的基础知识

时间:2009-09-22 20:37:40

标签: php optimization apc opcode-cache

目前在一个我不打算重新用于其他网站的非常大的项目中,我将网站的名称硬编码到各处的文件中。现在,如果我要更改网站名称,则需要花费很多精力才能在任何地方进行更改。我知道显而易见的解决方案是将名称存储为变量或常量,但我想你可以称之为我的微观优化思维方式:我总是认为它将是PHP必须解析的一件事。我确实意识到它没有多大区别,但我只是想知道使用像APC这样的操作码缓存是否意味着PHP甚至不需要重新解析它?

2 个答案:

答案 0 :(得分:6)

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

配置上的任何差异都意味着更多更多差异(例如,对于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%
  • 但由于没有检查修改,如果要考虑修改,则必须清除缓存


不过,我所说的是真的:可能很多你可以优化的东西意味着比简单的“我应该使用硬编码值”更重要的增益而不是“我应该使用常量/变量” ”

答案 1 :(得分:2)

这是完全正确的事情..没有进入令牌级细节......

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

enter image description here

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

enter image description here

使用操作码缓存。与任何可能的微优化相比,它将为您提供更多的性能提升。此外,在使用Zend OpCache时,会为您完成大量优化(例如,在未使用返回值时将$ i ++切换为++ $ i。)

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