PHP的工作原理和生命周期PHP是一种适合web开发的动态语言。可以说是一个用C语言实现的软件框架,有大量的组件。那么,php是如何工作的呢?它的生命周期是怎样的?PHP粗浅的分析就是在一个请求/响应的循环中运行服务器应用程序。当一个请求进入应用程序时,流程是这样的:PHP的每个请求都会重复上面的交互。php底层分析有两种运行模式:web模式和cli模式。不管是public模式,php的工作原理都是一样的,都是作为SAPI运行的。首先,了解一下SAPI,它是什么?Sapi的全称是ServerApplicationProgrammingInterface,即服务器应用程序编程接口。Sapi通过一系列的钩子函数使PHP能够与外围数据进行交互。这是一个非常优雅和成功的PHP设计。通过sapi,PHP本身和上层应用实现了解耦和隔离,PHP可以不再考虑如何兼容不同的应用,应用本身也可以根据自己的特点实现不同的处理方式。常见的SAPI包括cli、cgi、php-fpm和每个服务的特定sapi。在php的生命周期中,有四个关键调用:以nginx服务器为例,在web模式下,生命周期过程如下:SAPI运行PHP经过以下几个阶段:1.模块初始化阶段(moduleinit):该阶段主要进行php框架和zend引擎的初始化操作。这个阶段一般在SAPI启动时执行一次。对于FPM来说,是在fpm的master启动的时候执行的。PHP加载各个扩展的代码,调用它的模块初始化例程(MINIT)来申请一些模块需要的变量,内存分配等。2.请求初始化阶段(requestinit):当一个页面请求发生时,会经过处理请求之前的一个阶段。对于fpm来说,是worker进程接受请求,读取并解析请求数据后的一个阶段。在这个阶段,SAPI层将控制权交给了PHP层,PHP会为这个请求初始化执行脚本所需的环境变量。3.PHP脚本执行阶段PHP代码解析执行的过程。Zend引擎接管控制权,将php脚本代码编译成操作码并顺序执行。4.请求关闭:请求处理完成后,进入关闭阶段,PHP会启动清理进程。这个阶段会刷新输出内容,发送http响应内容等,然后依次调用各个模块的RSHUTDOWN方法。RSHUTDOWN用于清除程序运行时产生的符号表,即为每个变量调用unset函数。5、模块关闭阶段(moduleshutdown):该阶段在SAPI关闭时执行,对应模块初始化阶段。这个阶段主要是对PHP的各个模块进行资源清理和关闭操作。同时会回调各个扩展函数的模块关闭钩子。这发生在所有请求都结束之后,比如关闭fpm。(这是针对CGI、CLI等SAPI,没有“下一个请求”,所以SAPI开始立即关闭。)PHP核心架构图截图在:PHP底层运行机制及原理
