php7 开启zend-opcahe提升性能及原理解析

  首先:我们来了解一下php的执行过程解释 和什么是编译?

  一:执行过程的解释说明
 
  语言是人们进行沟通和交流的表达符号,每种语言都有专属于自己的符号,表达方式和规则。 就编程语言来说,它也是由特定的符号,特定的表达方式和规则组成。语言的作用是沟通,不管是自然语言,还是编程语言,它们的区别在于自然语言是人与人之间沟通的工具, 而编程语言是人与机器之间的沟通渠道。
  
  就PHP语言来说,它也是一组符合一定规则的约定的指令。 在编程人员将自己的想法以PHP语言实现后,通过PHP的虚拟机(确切的来说应该是PHP的语言引擎Zend)
       将这些PHP指令转变成C语言 (可以理解为更底层的一种指令集)指令,而C语言又会转变成汇编语言, 最后汇编语言将根据处理器的规则转变成机器码执行。这是一个更高层次抽象的不断具体化,不断细化的过程。
 
  什么是编译呢?
  
  从一种语言到另一种语言的转化称之为编译,这两种语言分别可以称之为源语言和目标语言。 这种编译过程通过发生在目标语言比源语言更低级(或者说更底层)。
 
   语言转化的编译过程是由编译器来完成, 编码器通常被分为一系列的过程:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等。 前面几个阶段(词法分析、语法分析和语义分析)的作用是分析源程序,我们可以称之为编译器的前端。 后面的几个阶段(中间代码生成、代码优化和目标代码生成)的作用是构造目标程序,我们可以称之为编译器的后端。
  一种语言被称为编译类语言,一般是由于在程序执行之前有一个翻译的过程, 其中关键点是有一个形式上完全不同的等价程序生成。而PHP之所以被称为 解释类语言,就是因为并没有这样的一个程序生成, 它生成的是中间代码Opcode,这只是PHP的一种内部数据结构。编译型的语言有C ,C++ ,JAVA 等,而解释型语言则是 PHP

  PHP的执行流程(详细版):
  1:加载PHP文件
  2:词法分析
  3:将PHP代码转为有意义的语言片段(Token)
       4:语法分析
  5:将Token和符合文法规则的代码抽象成语法树
  6:将语法树编译生成对应的opcode(php对应的指令标识)
  7:执行
 
 PHP的执行流程(简略版-Zend执行过程):
  • 1.Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)

  • 2.Parsing, 将Tokens转换成简单而有意义的表达式(词法、语法、语义分析)

  • 3.Compilation, 将表达式编译成Opocdes

  • 4.Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能,和机器指令运行相似。

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

  

  PHP的正常执行流程如下

   对应的流程如下:request请求(nginx,apache,cli等)-->Zend引擎读取.php文件-->扫描其词典和表达式 -->解析文件-->创建要执行的计算机代码(称为Opcode)-->最后执行Opcode--> response 返回

   每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,那么Opcode也不会变化,显然没有必要每次都重新生成Opcode,结合在Web中无所不在的缓存机制,我们可以把Opcode缓存下来,以后直接访问缓存的Opcode岂不是更快,启用Opcode缓存之后的流程图如下所示:

 

   Opcode cache 的目地是避免重复编译,减少 CPU 和内存开销,使其加载PHP文件更快。

 PHP的执行的核心是翻译出来的一条一条指令,也即opcode。

 Opcode是PHP程序执行的最基本单位。一个opcode由两个参数(op1,op2)、返回值和处理函数组成。PHP程序最终被翻译为一组opcode处理函数的顺序执行。

 参考资料:Opcode是啥以及如何使用好Opcache  https://www.zybuluo.com/phper/note/1016714

猜你喜欢

转载自www.cnblogs.com/xs-yqz/p/13178120.html