**php内核参考**
https://github.com/pangudashu/php7-internal
https://www.php.cn/php-weizijiaocheng-396287.html
```
<?php
echo "Hello World";
$a = 1 + 1;
echo $a;
?>
```
**模块初始化:php_module_startup()**
```
由apache、nginx触发
调用各个模块的MINIT方法
调用RINIT启动Zend引擎
初始化垃圾回收器
注册PHP定义的常量:PHP_VERSION等
解析php.ini
注册扩展,包括静态编译的扩展和动态加载的扩展
```
**请求初始化:php_request_startup()**
```
激活Zend引擎
激活SAPI
SAPI是服务器端应用编程接口。
这是 PHP 内核提供给外部调用其服务的接口,即外部系统可以通过 SAPI 来调用 PHP 提供的编译脚本、执行脚本的服务。PHP 中实现的 SAPI 有很多,Cli、Fpm 是我们比较常见的。
```
**脚本执行:php_execute_script()**
```
读取PHP源代码
-> 将源代码转换为语言片段TOKEN
-> 将TOKEN转换为简单而有意义的表达式
-> 将表达式转换为OPCODE
opcode是将PHP代码编译产生的Zend虚拟机可识别的指令,php7共有173个opcode,定义在zend_vm_opcodes.h中
PHP中的所有语法实现都是由这些opcode组成的。
编译是在zend_compile.h struct _zend_op函数执行。
zend_op_array是Zend引擎执行阶段的输入,整个执行阶段的操作都是围绕着这个结构
https://blog.csdn.net/pangudashu/article/details/68921858
-> 将OPCODE转换为AST抽象语法树
-> 执行器顺序执行opcodes 每次执行一条
现在有的Cache比如APC,可以使得PHP缓存住Opcodes,这样,每次有请求来临的时候,就不需要重复执行前面3步,从而能大幅的提高PHP的执行速度。
```
Lex就是一个词法分析的依据表。 Zend/zend_language_scanner.c会根据Zend/zend_language_scanner.l(Lex文件),来输入的 PHP代码进行词法分析,从而得到一个一个的“词”
PHP4.2开始提供了一个函数叫token_get_all,这个函数就可以讲一段PHP代码 Scanning成Tokens;
源码中的字符串,字符,空格,都会原样返回。每个源代码中的字符,都会出现在相应的顺序处。而,其他的比如标签,操作符,语句,都会被转换成一个包含俩部分的Array: Token ID (也就是在Zend内部的改Token的对应码,比如,T_ECHO,T_STRING),和源码中的原来的内容。
接下来,就是Parsing阶段了,Parsing首先会丢弃Tokens Array中的多于的空格,然后将剩余的Tokens转换成一个一个的简单的表达式
```
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阶段了,它会把Tokens编译成一个个op_array, 每个op_arrayd包含如下5个部分:
```
1.Opcode数字的标识,指明了每个op_array的操作类型,比如add , echo
2.结果 存放Opcode结果
3.操作数1 给Opcode的操作数
4.操作数2
5.扩展值 1个整形用来区别被重载的操作符
```
比如,我们的PHP代码会被Parsing成:
```
* ZEND_ECHO 'Hello World'
* ZEND_ADD ~0 1 1
* ZEND_ASSIGN !0 ~0
* ZEND_ECHO !0
```

**请求关闭:php_request_showdown()**
```
flush输出内容
发送HTTP应答header头
清理全局变量
关闭编译器
关闭执行器
回调各扩展request shutdown钩子函数
```
**模块关闭:php_module_showdown()**
```
php执行完,或遇到die、exit 都会触发RSHUTDOWN.
进行资源清理、PHP各模块关闭、回调各扩展moduel shutdown钩子函数。
SAPI生命周期结束,WEB服务器退出,会关闭模块,执行MSHUTDOWN方法
php终止执行会调用:register_shutdown_function
```
