第一个过程是模块初始化阶段(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。
模块要求初始化那么有很多同学在学习PHP的过程中难免会碰着很多困难,我为大家精心准备了相对应的教程,还有大量框架和PHP中高等教程!
帮助你进阶中高等程序员,升职涨薪!
绝对可以让你学到赚到!
获取方法点击下方文章链接即可!
全套laravel框架、ThinkPHP框架全套教程分享,PHP程序员福利!
PHP开拓三年只懂增编削查?那是你没有方案好php学习路线
运行
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引擎。