php 代码的执行

PHP内核的实现和世界上绝大数的程序一样,接收输入数据,做相应处理后输出结果。用PHP编写的代码就是输入数据,PHP内核对编写的代码进行解释和运算,最后返回运算结果。当编写的PHP代码给内核去执行的时候,PHP内核会对PHP代码进行词法分析、语法分析。词法分析把PHP代码分割成一个个的单元(token),语法分析则将这些单元转换为Zend Engine

可执行的操作。然后PHP内部的Zend Engine对这些操作进行顺序执行。Zend Engine时PHP内核的核心部分,负责最终操作的执行和结果的返回

SAPI接口

SAPI(Server Application Programming Interface) 是PHP具体应用的编程接口。脚本执行的开始都是以SAPI接口实现开始的。只是不同的SAPI接口实现会完成他们特定的工作

web服务器会将请求转发给SAPI,SAPI转发给zendEngine。

PHP常用的SAPI接口有CGI,CLI,FastCGI,Apache2Handler(mod_php模式运行)

无论使用何种SAPI接口都会经过两个主要的阶段,处理请求之前的开始阶段和请求之后的结束阶段,开始阶段有两个过程,第一个过程是模块初始化阶段(MINIT)在整个SAPI生命周期内该过程只进行一次,第二个过程是模块激活阶段(RINIT)该过程发生在请求阶段。请求处理后就进入了结束阶段,一般脚本执行到末尾或者通过调用exit()或die()函数,PHP都将进入结束阶段。结束阶段也分为两个环节,一个请求结束后停用模块,一个SAPI生命周期结束时关闭模块。

单进程SAPI生命周期

CLI/CGI模式的PHP属于单进程的SAPI模式。这类的请求在处理一次请求后就关闭。也就是只会经过如下几个环节: 开始 - 请求开始 - 请求关闭 - 结束 SAPI接口实现就完成了其生命周期。如图2.1所示:

 

图2.1 单进程SAPI生命周期
图2.1 单进程SAPI生命周期

多进程SAPI生命周期

通常PHP是编译为apache的一个模块来处理PHP请求。Apache一般会采用多进程模式, Apache启动后会fork出多个子进程,每个进程的内存空间独立,每个子进程都会经过开始和结束环节, 不过每个进程的开始阶段只在进程fork出来以来后进行,在整个进程的生命周期内可能会处理多个请求。 只有在Apache关闭或者进程被结束之后才会进行关闭阶段,在这两个阶段之间会随着每个请求重复请求开始-请求关闭的环节。 如图2.2所示:

 

图2.2 多进程SAPI生命周期
图2.2 多进程SAPI生命周期

多线程的SAPI生命周期(xampp apache2handler sapi 采用该模式)

多线程模式和多进程中的某个进程类似,不同的是在整个进程的生命周期内会并行的重复着 请求开始-请求关闭的环节

 

图2.3 多线程SAPI生命周期
图2.3 多线程SAPI生命周期

APACHE2HANDLER

原文地址:https://www.cnblogs.com/paulversion/p/8232735.html