php运行过程大致分为四步骤(确切说应该是PHP语言引擎ZEND):
Ⅰ. Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)
Ⅱ. Parsing, 将Tokens转换成简单而有意义的表达式
Ⅲ. Compilation, 将表达式编译成Opcodes
Ⅳ. Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。
我们的目的:缓存opcode
只做:Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能
优点:1.提升了速度 一般是2-5倍,流量大效果更明显
2. PHP脚本在编译的状态下,对服务器的开销几乎完全消除 (节省了CPU资源)
3.提高了性能php脚本的缓存性能
缺点:1.消耗你一点点内存
2.代码不要频繁的更新(因为更新代码opcode要重新生成)
3.生成的第一次比正常没有加加速器的时候慢(存在编译过程)
以下是原理图:
常见的几种加速:XCACHE(LIGHTHTTPD作者),APC,ZEND PLATFORM(商业),eAccelerator(落后的)
以下是对比报告:
http://itst.net/654-php-on-fire-three-opcode-caches-compared
opcode拿我们常见的APC来说 (facebook采用的) 据说PHP5.4以后都会内置OPCODE
1.当你require或者include 一个文件,首先检查这个opcodeCache 也就是检查是否在RAM内存里面是否有这个相应的opcode,如果有返回opcode直接执行,如果没有编译成opcode再执行
这里存在一个重要方面,require 文件的时候需要走整个路径 如果你直接写绝对路径 不用遍历,方便快速查找
autoload是这样的:
获取一个类的名称,然后转成相应的名称一样的文件,然后就是include /require 这个文件
apc缓存和autoload 是本身存在冲突的 因为 一个是在编译前 一个是在编译后
如果你本身就用了 autoload 建议不太必要用apc了