简述PHP执行流程

目的:

本文主要介绍PHP执行流程,目的是梳理php代码是如何最终转换成为机器二进制指令而被执行的
参考文章:https://blog.csdn.net/diavid/article/details/81035188

PHP层执行流程主要以下四步:

一. Scanning (Lexing) ,将PHP代码转换为语言片段(Tokens)
PHP4.2+开始提供了一个函数叫token_get_all ,这个函数就可以讲一段PHP代码 Scanning成Tokens
eg:

$code='';
        $tokens=token_get_all($code);
        print_r($tokens);
        exit();

输出结果:Array ( [0] => Array ( [0] => 379 [1] => 1 ) [1] => Array ( [0] => 382 [1] => [2] => 2 ) [2] => Array ( [0] => 320 [1] => $a [2] => 2 ) [3] => Array ( [0] => 382 [1] => [2] => 2 ) [4] => = [5] => Array ( [0] => 382 [1] => [2] => 2 ) [6] => Array ( [0] => 317 [1] => 1 [2] => 2 ) [7] => Array ( [0] => 382 [1] => [2] => 2 ) [8] => + [9] => Array ( [0] => 382 [1] => [2] => 2 ) [10] => Array ( [0] => 317 [1] => 1 [2] => 2 ) [11] => ; [12] => Array ( [0] => 382 [1] => [2] => 2 ) [13] => Array ( [0] => 328 [1] => echo [2] => 3 ) [14] => Array ( [0] => 382 [1] => [2] => 3 ) [15] => Array ( [0] => 320 [1] => $a [2] => 3 ) [16] => ; [17] => Array ( [0] => 382 [1] => [2] => 3 ) [18] => Array ( [0] => 381 [1] => ?> [2] => 4 ) )

返回的结果中, 源码中的字符串,字符,空格,都会原样返回。每个源代码中的字符,都会出现在相应的顺序处。而其他的比如标签,操作符,语句,都会被转换成一个包含俩部分的Array: Token ID (也就是在Zend内部的改Token的对应码,比如,T_ECHO,T_STRING),和源码中的原来的内容。

二. Parsing , 将Tokens转换成简单而有意义的表达式
Parsing首先会丢弃Tokens Array中的多余的空格,然后将剩余的Tokens转换成一个一个的简单的表达式
eg:

1. echo a constant string

2. add two numbers together

3. store the result of the prior expression to a variable

4. echo a variable

三. Compilation , 将表达式编译成Opocdes
Compilation阶段,它会把Tokens编译成一个个op_array,每个op_arrayd包含如下5个部分:

1. Opcode数字的标识,指明了每个op_array的操作类型,比如add,echo

2. 结果存放Opcode结果

3. 操作数1给Opcode的操作数

4. 操作数2

5. 扩展值1个整形用来区别被重载的操作符

注:PHP 5.5及以后自带opcache缓存拓展,在php.ini开启后可以对Opcode 进行缓存,这样每次有请求来临的时候,就不需要重复执行前面3步,从而能大幅的提高PHP的执行速度。

四. Execution , 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。
上面的opcode 指令并不是二进制的机器码,而是C实现php软件时定义的指令,最后指令的执行都得调用c语言实现的方法,而这些方法都是zendVM 提前实现,并经过编译成汇编,最后汇编再转换为目标机器的二进制码,这种方式叫解析执行,JVM解析执行java 二进制码也基本是这个逻辑;
另外,除了解析执行, jvm 跟zendvm(PHP 8后) 都实现了即时编译(Just-In-Time compilation,JIT),即将一个方法中包含的所有字节码编译成机器码后再执行,如下图;
简述PHP执行流程_第1张图片
最后贴上一个PHP 完整执行流程图
简述PHP执行流程_第2张图片

后语:从上面的流程看 php 如果开启opcache 整个执行流程应该跟java是差不多,但为啥大家都说java性能要比PHP 高很多呢?后面将会对java 为啥比php快做一个比较完整的分析;

你可能感兴趣的:(PHP,php,php执行流程,php与二进制码,php,与Java)