深入PHP编译缓存

 

如果你想提高PHP项目的运行速度,编译缓存应该是你的选择之一。安装一个编译缓存能到产生极大的性能提升。目前最常见的PHP编译缓存工具有:APC,Accelerator,xcache(国产)等等。关于三者的安装和比较在这里就不阐述了。
那么什么是编译缓存呢?为什它能产生这么令人印象深刻的性能提升呢?为了更好的理解这些,我们首先需要了解Zend Engine执行PHP代码的过程及原理。在调用PHP执行代码的时候,通常需要下面两步:

1、编译过程。PHP读取文件,并解析该文件,然后生成能够在Zend Engine虚拟机上执行的中间码(通常是opcode)。
2、执行过程。PHP直接执行中间码opcode.


在这个过程中,有几点是需要注意的:

1、对许多代码文件说,特别是含有很多包含文件(include or require)。它们需要花费更多的时间和解析并产生中间代码。
2、即使PHP代码文件没有发生改变,这个执行过程还会严格的按照流程执行。也就是说,无论你的应该程序是否发生改变,每次调用的时候,都需要重新编译。(其实这就是编译缓存存在的理由)
3、这个流程不仅仅发生在主要的代码文件,对于每一次的include和require来说,都会执行这个流程。(这是可以继续优化的)



下图显示了在没有编译缓存的情况下,执行一个文件的流程。

编译缓存就是用来缓存PHP执行的中间码OPCODE,从而提升PHP执行速度的yi中工具。加入编译缓存后的执行流程如下:

编译缓存去掉了执行PHP过程中的解析过程(类似JAVA编译成CLASS文件),所以它对含有大量PHP代码的应用程序是非常有效的。通常情况下可以提升2-3倍以上的速度。对于包含大量include文件的项目,编译缓存更现实出它的优越性。

PS:在PHP项目中,过多的include文件会降低程序性能的,但include文件本身可以带来发开发和维护的方便性。如何取舍就看具体应用了。另外编译缓存是对具体的PHP文件的,也就是说include过程本身是没有被编译缓存的。

关于"include过程没有被编译缓存,即include与require都是运行时"的注解:

引用:
比如现在有两个文件:main.php 和tobeInclude.php
其中main.php中有这样的语句include 'tobeInclude.php'

假设中间码的后缀为.op(实际上不是这样)

那么加上缓存cache后 main.php=>main.op , tobeInclude.php=>tobeInclude.op

但是PHP在执行main.php的时候,她还是需要去解析main.op中的include命令,去调用tobeInclude.op的内容。
具体流程是这样的。
...=>执行main.op=>执行tobeInclude.op=>...
而不是之间简单的执行main.op

所以说“过多的include文件会降低程序性能的”

你可能感兴趣的:(深入PHP编译缓存)