一个PHP实例一定会经过Module init , Request init,Request shutdown ,Module shutdown四个阶段
两种init和两种shutdown各会执行多少次,取决于php使用什么sapi与宿主通信,最常见的四种方式是:
1)直接以CLi/CGI模式调用
2)多进程模块
3)多线程模块
4)Embedded(嵌入式,在自己的C程序中调用Zend Engine)
SAPI(Server abstraction API,服务抽象化程序接口)提供一个接口,使得PHP可以和其它的应用程序进行交互,也就是说php能和其它程序如apache等交互就是这个接口在起作用
在命令模式下运行一个php程序的主要流程如下:
以请求test.php为例:
php -f test.php --> call each extension's minit --> request test.php --> call each extension's rinit --> execute test.php --> call each extension's rshutdown --> finish cleaning up after test.php --> call each extension's mshutdown --> tesminate php
我们在命令行敲入:php -f test.php 时,发生过过程大概如下:
1)call each extension's minit 这个过程在函数被载入时调用,一般写在扩展的以下函数里:
PHP_MINIT_FUNCTION(myext){
//注册常量或者类的初始化等操作
return success;
}
2)request test.php
请求test.php文件,当请求到达后php会初始化脚本执行的环境,比如创建一个执行环境,包括保存PHP运行过程中需要的变量名称和变量值内容的符号表,以及当前所有的函数及类等信息的符号表,然后PHP会调用所有模块的rinit函数,在这个阶段各个模块也执行以下相关的操作,模块的rinit和minit类似
PHP_RINIT_FUNCTION(myext){
/*例如记录请求开始时间*/
return success;
}
3)execute test.php
执行test.php 主要是把PHP文件编译成opcodes,然后在PHP虚拟机下执行
4)call each extension's rshutdown
请求处理完进入结束阶段,如执行到脚本结尾或者遇到exit die,和请求开始类似,结束也分为rshutdown和mshutdown两个阶段
PHP_RSHUTDOWN_FUNCTION(myext){
/*例如记录请求结束时间*/
return success;
}
PHP_MSHUTDOWN_FUNCTION(myext){
/*注销一些持久化资源*/
return success;
}