出处:http://cc.ecjtu.net/posts/php-life-cycle
PHP脚本通过SAPI与宿主通信,常见的方式有单进程(CLI/CGI模式),多进程(通常编译为apache的模块来处理
PHP请求),多线程模式,还有一种Embed SAPI(PHP嵌入式,允许在C/C++语言中调用PHP/ZE提供的函数)。
无论通过哪种SAPI运行PHP都经过下面几个阶段:
1:模块初始化阶段(Module init)即调用每个拓展源码中的的PHP_MINIT_FUNCTION中的方法初始化模块,进行
一些模块所需变量的申请,内存分配等。
2:请求初始化阶段(Request init),即接受到客户端的请求后调用每个拓展的PHP_RINIT_FUNCTION中的方法,
初始化PHP脚本的执行环境。
3:执行PHP脚本
4:请求结束(Request Shutdown),这时候调用每个拓展的PHP_RSHUTDOWN_FUNCTION方法清理请求现场
,并且ZE开始回收变量和内存。
5:关闭模块(Module shutdown)Web服务器退出或者命令行脚本执行完毕退出会调用拓展源码中的
PHP_MSHUTDOWN_FUNCTION 方法。
下面的介绍摘自TIPI:
单进程SAPI生命周期
CLI/CGI模式的PHP属于单进程的SAPI模式。这类的请求在处理一次请求后就关闭。也就是只会经过如下几个环节: 开始 - 请求开始 - 请求关闭 - 结束 SAPI接口实现就完成了其生命周期。如图2.1所示:
多进程SAPI生命周期
通常PHP是编译为apache的一个模块来处理PHP请求。Apache一般会采用多进程模式, Apache启动后会
fork出多个子进程,每个进程的内存空间独立,每个子进程都会经过开始和结束环节, 不过每个进程的开始阶
段只在进程fork出来以来后进行,在整个进程的生命周期内可能会处理多个请求。 只有在Apache关闭或者进程
被结束之后才会进行关闭阶段,在这两个阶段之间会随着每个请求重复请求开始-请求关闭的环节。
如图2.2所示:
多线程的SAPI生命周期
多线程模式和多进程中的某个进程类似,不同的是在整个进程的生命周期内会并行的重复着 请求开始-请求关
闭的环节
Embed的SAPI生命周期
Embed SAPI是一种比较特殊的sapi,容许你在C/C++语言中调用PHP/ZE提供的函数。并且这种sapi和上面的三
种一样,按Module Init、Request Init、Rshutdown、mshutdown的流程执行着。 当然,这只是其中一种情况。
因为特定的应用由自己特殊的需求,只是在处理PHP脚本这个环节基本一致。
真正令emebed模式独特的是因为它可能随时嵌入到某个程序里面去(比如你的test.exe里),然后被当作脚本的
一部分在一个请求的时候执行。控制权在PHP和原程序间来回传递。