php_execute.png

第1步:词法分析将PHP代码转换为有意义的标识Token。该步骤的词法分析器使用Re2c实现的。

第2步:语法分析将Token和符合文法规则的代码生成抽象语法树。语法分析器基于Bison实现。语法分析使用了巴科斯范式(BNF)来表达文法规则,Bison借助状态机、状态转移表和压栈、出栈等一系列操作,生成抽象语法树。

第3步:上步的抽象语法树生成对应的opcode,被虚拟机执行。opcode是PHP7定义的一组指令标识,指令对应着相应的handler(处理函数)。当虚拟机调用opcode,会找到opcode背后的处理函数,执行真正的处理。以我们常见的echo语句为例,其对应的opcode便是ZEND_ECHO。

注意:这里为了便于理解词法分析和语法分析过程,将两者分开描述。但实际情况,出于效率考虑,两个过程并非完全独立。

下面,我们通过一段示例代码,来建立PHP7运转的初步理解。

示例代码如下:

echo "hello world";

这段代码首先会被切割为Token。

Token

Token是PHP代码被切割成的有意义的标识。本书介绍的PHP7版本中有137 种Token,在zend_language_parser.h文件中做了定义:

/* Tokens. */

#define END 0

#define T_INCLUDE 258

#define T_INCLUDE_ONCE 259

#define T_ERROR 392

PHP提供了token_get_all()函数来获取PHP代码被切割后的Token,可以在深入源码学习前,粗略查看PHP代码被切割后的Token。如下代码片段:

$lan = '<?php $a = 1; echo $a';

$tokens = token_get_all($lan);

foreach ($tokens as $token) {

if (is_array($token)) {

echo "Line {$token[2]}: ", token_name($token[0]), " ('{$token[1]}')", PHP_EOL;

}

}

打印结果为

Line 1: T_OPEN_TAG ('<?php ')

Line 1: T_VARIABLE ('$a')

Line 1: T_WHITESPACE (' ')

Line 1: T_WHITESPACE (' ')

Line 1: T_LNUMBER ('1')

Line 1: T_WHITESPACE (' ')

Line 1: T_ECHO ('echo')

Line 1: T_WHITESPACE (' ')

Line 1: T_VARIABLE ('$a')

二维数组的每个成员数组第一个值token[0]为Token对应的枚举值;第二个值token[1]为Token对应的原始字符串内容;第三个值token[2]为代码对应的行号。

可见,Token就是一个个的“词块”,但是单独存在的词块不能表达完整的语义,还需要借助规则进行组织串联。语法分析器就是这个组织者。它会检查语法、匹配Token,对Token进行关联。

PHP7中,组织串联的产物就是抽象语法树(Abstract Syntax Tree,AST)。

2:AST

AST是PHP7版本新特性。在这之前的版本,PHP代码的执行过程中没有生成AST这一步。PHP7对抽象语法树的支持,实现了PHP编译器和解释器解耦,有效提升了可维护性。

顾名思义,抽象语法树具有树状结构。AST的节点分为多种类型,对应着不同的PHP语法。在当前章节,我们可以认为节点类型是对语法规则的抽象,例如赋值语句,生成的抽象语法树节点为ZEND_AST_ASSIGN。而赋值语句的左右操作数,又将作为ZEND_AST_ASSIGN类型节点的孩子。通过这样的节点关系,构建出抽象语法树。

3: Opcodes

AST扮演了源码到中间代码的临时存储介质的角色,还需要将其转换为opcode,才能被引擎直接执行。Opcode只是单条指令,Opcodes是opcode的集合形式,是PHP执行过程中的中间代码,类似Java中的字节码。生成之后由虚拟机执行。

我们知道,PHP工程优化措施中有个比较常见的“开启Opcache”,指的就是这里的Opcodes的缓存(Opcodes Cache)。通过省去从源码到opcode的阶段,引擎可以直接执行缓存的opcode,以此提升性能。

php调用execute,php运行生命周期--脚本执行阶段 php_execute相关推荐

  1. MonoBehaviour Lifecycle(生命周期/脚本执行顺序)

    脚本执行顺序 前言 搭建一个示例来验证Unity脚本的执行顺序,大概测试以下部分: 物理方面(Physics) 渲染(Scene rendering) 输入事件(InputEvent) 流程图 Uni ...

  2. Unity脚本生命周期与执行顺序

    目录 脚本生命周期 MonoBehavior生命周期图 脚本执行顺序 自定义执行顺序 @(文章目录) 在Unity中,脚本可以理解为附加在游戏对象上的用于定义游戏对象行为的指令代码.必须绑定在游戏对象 ...

  3. 附实例!图解React的生命周期及执行顺序

    本文由云+社区发表 作者:前端林子 1.七个可选的生命周期 可以结合下图来看: (1) componentWillMount() 仅在render()方法前被调用一次,如果在该方法中调用了setSta ...

  4. ASP.NET页生命周期介绍:阶段,事件及其他

    ASP.NET页生命周期介绍:阶段,事件及其他 本文概述了asp.net的页生命周期.在页生命周期的每个阶段中,页将引发可运行您自己的代码进行处理的事件. asp.net 页运行时,此页将经历一个生命 ...

  5. android生命周期_Android活动生命周期– 7个阶段和功能

    android生命周期 Activity is one of the primary components of an Android application. In this tutorial, w ...

  6. Vue08/Vue 生命周期钩子函数( Vue生命周期11个阶段 )应用场景

    Vue生命周期 Vue生命周期介绍 Vue生命周期是指Vue实列对象从创建之初到销毁的过程 一. Vue生命周期11个阶段 创建 beforeCreate  //数据初始化前 created      ...

  7. 外包项目开发课程整理一:SDLC传统系统开发生命周期7个阶段

    外包项目开发课程整理一:SDLC传统系统开发生命周期7个阶段 前言: 课程全称为:通过案例学习外包项目开发,是软件工程专业大三下的课程,我将根据中方外方ppt教授讲述内容及上网搜索的知识对本课程进行系 ...

  8. 软件的生命周期的若干阶段

    要做好一个软件,要了解软件的生命周期,在什么阶段,要做好什么事情! 在了解软件的生命周期之前,先了解一下软件工程. 软件工程 软件工程是一门研究用工程化方法构建和维护有效的.实用的和高质量的软件的学科 ...

  9. Vue生命周期(初始阶段、挂载阶段、更新阶段、销毁阶段)

    目录 钩子函数 Vue生命周期之初始化阶段 Vue生命周期之挂载阶段 Vue生命周期之更新阶段 Vue生命周期之销毁阶段 代码执行: 首先,我们了解一下"生命周期"这个词.    ...

最新文章

  1. C语言实现RC4序列密码
  2. 说说.net事件和委托。
  3. 儿童版「微信」要来了?
  4. HTTP文件浏览(静态文件+express4.x+md/code文件渲染)
  5. laravel中Request、Session、Response、Middelware
  6. cxGRID能否对模板进行保存
  7. “计量确认”与“检定”之区别
  8. 你不得不看的六篇知识图谱落地好文
  9. oracle unused用法,set unused的用法(ORACLE刪除字段)
  10. Asp.net MVC4 Knockoutjs BootStrap Ace NinJect Jqgrid sqlserver2008
  11. SAP License:销售流程
  12. 手机sstv解码软件_关于二维码扫描使用专业扫描设备和手机二维码扫描软件的区别?...
  13. artTemplate -- 性能卓越的 js 模板引擎
  14. 列表: ul/ol/dl - bootStrap4常用CSS笔记
  15. unity3D学习笔记2
  16. Gary Gygax的倒台,密切关注Linux端口等
  17. eclipse新建java项目报错 jrt-fs.jar
  18. 解决torch.cuda.is_available()返回False的问题
  19. 解决Cookie乱码问题
  20. 基于Php电竞赛事管理系统设计与实现

热门文章

  1. 上下定高 中间自适应_联合首发|医药供应链平台一块医药获新一轮融资,赋能产业上下游提质增效...
  2. vs的资源管理器中一次性添加整个文件夹
  3. pytorch dropout用法
  4. Uncaught TypeError: Cannot read property 'setAttribute' of null
  5. 分割开源资料整理segmentation
  6. MobileNetv2优化问题
  7. python 调用C++,传递int,char,char*,数组和多维数组
  8. idea main java.lang.ClassNotFoundException
  9. fftw_plan_dft_2d优化
  10. php laravel框架项目实例