php是以请求/响应为周期运行服务端应用程序,当请求进入应用程序,流程如下:
程序开始启动->服务端处理请求->产生响应,将请求的结果返回给响应的客户端->程序结束
php的运行模式有两种:web模式和cli模式。
无论是哪种公众模式,php的工作原理都是一样的,都是作为一种SAPI运行。
sapi成功的将PHP本身和上层应用解耦隔离
SAPI (Server Application Programme Interface) “服务器应用程序接口”,可以认为是服务器端的 API
常见的SAPI有cli、cgi、php-fpm以及各服务具体的sapi。
SAPI运行PHP都经过下面几个阶段:
1.MINT 2.RINT 3RSHUTDOWN 4.MSHUTDOWN
1.MINT :module init 模块初始化阶段。
在SAPI启动时执行一次,对于FPM而言,就是在fpm的master进行启动时执行的
激活sapi,初始化垃圾回收器,启动zend引擎,读取配置文件,引入扩展
php加载每个扩展的代码并调用其模块初始化例程(minit),申请模块所需要的变量,内存分配
2.RINT :request init 请求初始化阶段
当一个页面请求发生时,在请求处理前都会经历的一个阶段。
对于fpm而言,是在worker进程accept一个请求并读取,解析完请求数据后的一个阶段。
在这个阶段内,SAPI层将控制权交给php层,php初始化本次请求执行脚本所需的环境变量。
3.php脚本执行阶段
php代码解析执行的过程。Zend引擎接管控制权,将php脚本代码编译成opcodes并顺次执行
4.RSHUTDOWN 请求结束阶段(request shutdown):
请求处理完后就进入了结束阶段,PHP就会启动清理程序。
是在PHP脚本执行完毕之后将返回结果输出、发送HTTP应答header头阶段
这个阶段,将flush输出内容、发送http响应内容等,然后它会按顺序调用各个模块的RSHUTDOWN方法。
RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。
5.MSHUTDOWN 模块关闭阶段(module shutdown):
模块初始化阶段的相反阶段,清理资源,关闭模块
该阶段在SAPI关闭时执行,与模块初始化阶段对应,这个阶段主要是进行资源的清理、php各模块的关闭操作,同时,将回调各扩展的module shutdown钩子函数。这是发生在所有请求都已经结束之后,例如关闭fpm的操作。(这个是对于CGI和CLI等SAPI,没有“下一个请求”,所以SAPI立刻开始关闭。)