PHP底层运行机制

PHP底层运行机制
1.扫描:先进行语法分析与词法分析,将PHP转换为语言片段(tokens);

2.解析:将语言片段转换为有意义的表达式

3.编译:将表达式编译成中间码(opcodes)

4.执行:顺序执行opcodes,每次一条,从而实现PHP脚本功能

5.输出:将要输出的内容输出到缓冲区

1.扫描阶段

scanning:先进行语法分析和词法分析,并将PHP代码转换为语言片段(tokens)

扫描完后返回的结果分三部分:

a.TokenID 即词的ID

b.词的具体内容

c.所在的位置行数

2.解析阶段

词法分析后,将Tokens转换为有意义的表达式

首先会将Tokens Array中多余的空格丢弃,然后将剩余的Tokens转换成一个一个的简单表达式

3.编译阶段

将表达式编译成opcode

4.执行阶段

顺序执行opcode,每次一条,从而实现PHP脚本功能

5.输出阶段

输出(output Buffer) 将要输出的内容输出到缓冲区

PHP相关组成

1.SAPI 提供语言的编译与执行服务,有标准的输入和输出,是PHP的接入层,它接收用户的请求,然后调用PHP内核提供的一些接口完成PHP脚本的执行。常用的SAPI有cli、php-fpm,cli是命令行下执行PHP脚本的实现:bin/php script.php,它是单进程的,处理模型比较简单,而php-fpm相对比较复杂,它实现了网络处理模块,用于与web服务器交互

2.zend引擎

PHP语言实现的最为重要的部分,是PHP最基础、最核心的部分,PHP代码从编译到执行都是由Zendd完成的。

分两部分:

a.编译器:负责将PHP代码编译为抽象语法树,然后进一步编译为可执行的opcodes,这个过程相当于GCC,编译器是一个语言实现的基础

b.执行器:负责执行编译器输出的opcodes,也就是执行PHP脚本中编写的代码逻辑

FPM

fastCGI是web服务器(nginx,apche)与处理程序之间的一种通信协议,由于PHP没有http网络库,所以实现了fastCGI协议,然后与WEB服务器配合实现了http请求的处理,web服务器处理http请求后,将解析结果通过fastCGI协议转发给处理程序,处理程序处理完成后再将结果返回给WEB服务器

fpm的实现就是创建一个master进程,再master进程中创建并监听socker,然后fork出多个子进程,这些子进程各自accept请求,子进程的处理非常简单,它在启动后阻塞accept上,有请求到达后开始读取请求数据,读取完成后开始处理再返回,在这期间是不会接收其它请求的,也就是说fpm的子进程同时只能响应一个请求,只有把这个请求执行完了才会accept下一个请求。与nginx事件驱动有很大区别,nginx的子进程通过epoll管理套接字,如果一个请求数据还未发送完成则会处理下一个请求,即一个进程会同 时连接多个请求,它是非阻塞的模型,只处理活跃的套接字。