Opache详解

Opcache的前生是Optimizer+, 它是PHP官方公司Zend开发的一款闭源但可以免费使用的PHP优化加速组件。
Optimizer+将PHP代码预编译生成的脚本文件Opcode缓存在共享内存中供以后反复使用,从而避免了从磁盘读取代码再次编译的时间消耗。
同时,它还应用了一些代码优化模式,使得代码执行更快,从而加速PHP的执行。

request请求(nginx, apache等)-> Zend引擎读取.php文件-> 扫描其词典和表达式(词法分析)->解析文件->创建要执行的计算机代码(称为Opcode)->最后执行Opcode->response返回
每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么Opcode也不会变化,显然没必要每次都重新生成Opcode, 结合在Web中无所不在的缓存机制,我们可以把Opcode缓存下来,以后直接访问缓存的Opcode岂不是更快,启用Opcode缓存之后的流程图如下所示:

Opcode cache 的目的是避免重复编译,减少CPU和内存开销。
PS: 当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code, opcode), 动态内容的性能瓶颈不在cpu和内存,而在I/O操作,比如数据库查询带来的I/O开销,那么opcache的性能提升非常有限,但总归是好的。
Opcode原理
Opcode 是一种PHP脚本编译后的中间语言,就像Java的ByteCode, 或者.NET的MSL。举个例子,比如你写个php代码:

<?php   
echo “Hello World”;  
 $a = 1 + 1;   
echo $a;
?>

PHP(PHP引擎Zend)执行这段代码会经过如下4个步骤:
1.Scanning , 将PHP代码转换为语言片段(Tokens)
2.Parsing, 将Tokens转换成简单而有意义的表达式
3.Compilation,  将表达式编译Opcodes
4.Execution, 顺次执行Opcodes, 每次一条,从而实现PHP脚本功能。
每次请求来,就不需要重复执行前面三步,从而大幅提高PHP执行速度。


Opcode是php语言里供zend引擎执行的一种中间代码,类似java中的字节码,或者python中的字节码对象pycodeobject.