php生命周期的详解

时间:2020-02-01 00:51:31   收藏:0   阅读:128

单进程SAPI生命周期

技术图片

 

启动

在调用每个模块的模块初始化前,会有一个初始化的过程,它包括:

这里的初始化操作包括内存管理初始化、 全局使用的函数指针初始化(如前面所说的zend_printf等),对PHP源文件进行词法分析、语法分析、 中间代码执行的函数指针的赋值,初始化若干HashTable(比如函数表,常量表等等),为ini文件解析做准备, 为PHP源文件解析做准备,注册内置函数(如strlen、define等),注册标准常量(如E_ALL、TRUE、NULL等)、注册GLOBALS全局变量等。

将这些模块注册到已注册模块列表(module_registry),如果注册的模块已经注册过了,PHP会报Module XXX already loaded的错误。 1. 将每个模块中包含的函数注册到函数表( CG(function_table) ),如果函数无法添加,则会报 Unable to register functions, unable to load。

在内置模块和附加模块后,接下来是注册通过共享对象(比如DLL)和php.ini文件灵活配置的扩展。

在所有的模块都注册后,PHP会马上执行模块初始化操作(zend_startup_modules)。 它的整个过程就是依次遍历每个模块,调用每个模块的模块初始化函数, 也就是在本小节前面所说的用宏PHP_MINIT_FUNCTION包含的内容。

在处理了文件相关的内容,PHP会调用php_request_startup做请求初始化操作。 请求初始化操作,除了图中显示的调用每个模块的请求初始化函数外,还做了较多的其它工作,其主要内容如下:

这里的环境初始化是指在用户空间中需要用到的一些环境变量初始化,这里的环境包括服务器环境、请求数据环境等。 实际到我们用到的变量,就是POST、_GET、COOKIE、_SERVER、ENV、_FILES。

运行

DEACTIVATION

PHP关闭请求的过程是一个若干个关闭操作的集合,这个集合存在于php_request_shutdown函数中。 这个集合包括如下内容:

调用所有通过register_shutdown_function()注册的函数。这些在关闭时调用的函数是在用户空间添加进来的。 一个简单的例子,我们可以在脚本出错时调用一个统一的函数,给用户一个友好一些的页面,这个有点类似于网页中的404页面。

执行所有可用的__destruct函数。 这里的析构函数包括在对象池(EG(objects_store)中的所有对象的析构函数以及EG(symbol_table)中各个元素的析构方法。

将所有的输出刷出去。

发送HTTP应答头。这也是一个输出字符串的过程,只是这个字符串可能符合某些规范。

遍历每个模块的关闭请求方法,执行模块的请求关闭操作,这就是我们在图中看到的Call each extension’s RSHUTDOWN。

销毁全局变量表(PG(http_globals))的变量。

通过zend_deactivate函数,关闭词法分析器、语法分析器和中间代码执行器。

调用每个扩展的post-RSHUTDOWN函数。只是基本每个扩展的post_deactivate_func函数指针都是NULL。

关闭SAPI,通过sapi_deactivate销毁SG(sapi_headers)、SG(request_info)等的内容。

关闭流的包装器、关闭流的过滤器。

关闭内存管理。

重新设置最大执行时间

结束

最终到了要收尾的地方了。

flush

sapi_flush将最后的内容刷新出去。其调用的是sapi_module.flush,在CLI模式下等价于fflush函数。

关闭Zend引擎

zend_shutdown将关闭Zend引擎。

来源:http://www.1994july.club/seojishu/?p=3656

参考:http://www.1994july.club/seojishu/?p=3653

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!