当前位置:首页 > Web开发 > 正文

这也是一个输出字符串的过程

2024-03-31 Web开发

第一个过程是模块初始化阶段(MINIT), 在整个SAPI生命周期内(例如Apache启动以后的整个生命周期内或者命令行措施整个执行过程中), 该过程只进行一次。第二个过程是模块激活阶段(RINIT),该过程产生在请求阶段, 例如通过url请求某个页面,则在每次请求之前城市进行模块激活(RINIT请求开始)

请求达到之后PHP初始化执行脚本的根基环境,例如创建一个执行环境,包孕生存PHP运行过程中变量名称和值内容的标记表, 以及当前所有的函数以及类等信息的标记表。然后PHP会挪用所有模块的RINIT函数, 在这个阶段各个模块也可以执行一些相关的操纵

一般脚本执行到末尾或者通过挪用exit()或die()函数, PHP都将进入结束阶段。和开始阶段对应,结束阶段也分为两个环节,一个在请求结束后停用模块(RSHUTDOWN,对应RINIT), 一个在SAPI生命周期结束(Web处事器退出或者命令行脚本执行完毕退出)时封锁模块(MSHUTDOWN,对应MINIT)

单进程SAPI生命周期

开始 - 请求开始 - 请求封锁 - 结束

技术图片

启动

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

初始化若干全局变量

初始化若干常量

初始化Zend引擎和核心组件

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

解析php.ini

全局操纵函数的初始化

初始化静态构建的模块和共享模块(MINIT)

将这些模块注册到已注册模块列表(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做请求初始化操纵。 请求初始化操纵,除了图中显示的挪用每个模块的请求初始化函数外,还做了较多的其它事情,其主要内容如下:

PHP的执行环境除了上面的一些变量外,还有错误措置惩罚惩罚,异常措置惩罚惩罚等等,这些都是在这里被初始化的。 通过php.ini配置的zend_extensions也是在这里被遍历挪用activate函数。

激活SAPI

环境初始化

这里的环境初始化是指在用户空间中需要用到的一些环境变量初始化,这里的环境包孕处事器环境、请求数据环境等。 实际到我们用到的变量,就是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引擎。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30795.html