Zend引擎

简介

The Zend Engine is the open source scripting engine that interprets the PHP programming language.
复制代码

Zend引擎是开源的解释php语言的脚本引擎。php

PHP执行示意图

Zend有两部分组成,即编译器和执行器。编译器负责将PHP代码编译为抽象语法树,而后进一步编译为可执行的opcodes,这个过程至关于GCC的工做,编译器是一个语言实现的基础;执行器负责执行编译器输出的Opcodes,也就是执行PHP脚本中编写的代码逻辑。 Opcode是将PHP代码编译产生的Zend虚拟机可识别的指令,php7共有173个Opcode,定义在zend_vm_opcodes.h中,PHP中的全部语法实现都是由这些opcode组成的。html

Zend Engine最主要的特性就是把PHP的边解释边执行的运行方式改成先进行预编译(Compile),而后再执行(Execute)
复制代码

详细原理

见连接3(我没看完,不太懂,仍是太年轻啊~~)。git

优缺点

  • 执行效率大幅提高
  • 下降解耦,可扩展加强
  • Zend Engine 将代码分红编译和执行两大部分。通常状况下,咱们的代码完成之后就不多再去改变了。但执行时PHP却不得不从新编译,耗时而且浪费资源。(因此才有Opcache呀~)

Opcode

Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL。PHP执行代码会通过以下4个步骤(确切的来讲,应该是PHP的语言引擎Zend):github

1.Scanning(Lexing) ,将PHP代码转换为语言片断(Tokens)
  2.Parsing, 将Tokens转换成简单而有意义的表达式
  3.Compilation, 将表达式编译成Opocdes
  4.Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。
复制代码

如今有的Cache好比APC、Opcache(APC止步于PHP 5.4,Zend Opcache从PHP 5.5 开始集成,取代APC。),可使得PHP缓存住Opcodes,这样,每次有请求来临的时候,就不须要重复执行前面3步,从而能大幅的提升PHP的执行速度。 以下图:数据库

https://user-gold-cdn.xitu.io/2018/2/22/161bbf47aa4136ad?w=838&h=306&f=png&s=21396

小插曲

有一次线上发代码了(修改了数据库),可是数据库里面数据没进来,很是诡异,怀疑是代码没有发成功,后来leader在群里对运维说Opcache(原理就是缓存Opcodes)没有更新。。。小坑小坑缓存

参考

  1. www.careerride.com/PHP-zend-en…
  2. www.kancloud.cn/nickbai/php…
  3. github.com/pangudashu/…
  4. www.nowamagic.net/librarys/ve…
  5. www.cnblogs.com/JohnABC/p/4…
  6. www.laruence.com/2008/06/18/…
相关文章
相关标签/搜索