PHP单进程SAPI思维导图
2021-05-26 15:40:09 0 举报
AI智能生成
PHP单进程SAPI思维导图,详细描述了每一步的动作。
作者其他创作
大纲/内容
开始阶段
模块初始化阶段(MINIT)
初始化若干全局变量
初始化若干常量
初始化Zend引擎和核心组件
内存管理初始化
全局使用的函数指针初始化(如前面所说的zend_printf等)
对PHP源文件进行词法分析、语法分析、中间代码执行的函数指针的赋值
初始化若干HashTable(比如函数表,常量表)
为ini文件解析做准备
为PHP源文件解析做准备
注册内置函数(如strlen、define等)
注册标准常量(如E_ALL、TRUE、NULL等)
注册GLOBALS全局变量
解析php.ini
初始化参数配置表
调用当前模式下的ini初始化配置
全局操作函数的初始化
php_startup_auto_globals函数会初始化在用户空间所使用频率很高的一些全局变量($_GET、$_POST、$_FILES)
zend_register_auto_global函数只是将这些变量名添加到CG(auto_globals)这个变量表
php_startup_sapi_content_types函数用来初始化SAPI对于不同类型内容的处理函数
初始化静态构建的模块和共享模块(MINIT)
php_register_internal_extensions_func函数用来注册静态构建的模块,也就是默认加载的模块(内置模块)
字符串函数
数学函数
数组操作函数
日历扩展模块
FTP扩展模块
session扩展模块
将(1中的模块)这些模块注册到已注册模块列表(module_registry)
将(1中的模块)每个模块中包含的函数注册到函数表( CG(function_table) )
PHP会注册附加的模块
注册通过共享对象(比如DLL)和php.ini文件灵活配置的扩展
以上注册完成后,执行模块初始化操作(zend_startup_modules)
禁用函数和类
php_disable_functions函数用来禁用PHP的一些函数(配置文件的disable_functions变量)
php_disable_classes函数用来禁用PHP的一些类(配置文件的disable_classes变量)
模块激活阶段(RINIT)
激活Zend引擎
gc_reset函数用来重置垃圾收集机制
init_compiler函数用来初始化编译器(opcode的数组清空,准备编译时用来的数据结构)
init_executor函数用来初始化中间代码执行过程
函数列表、类列表赋值给执行的全局变量中(EG(function_table) = CG(function_table))
中间代码执行是在PHP的执行虚拟栈中,初始化时这些栈等都会一起被初始化
存放变量的符号表(EG(symbol_table))会被初始化为50个元素的hashtable
存放对象的EG(objects_store)被初始化了1024个元素
错误处理,异常处理的初始化
php.ini配置的zend_extensions也是在这里被遍历调用activate函数
激活SAPI
针对HTTP请求的方法设置一些内容,比如当请求方法为HEAD时,设置SG(request_info).headers_only=1
处理请求数据,将post原始数据写入$HTTP_RAW_POST_DATA变量
通过sapi_module.read_cookies读取cookie的值
环境初始化(用户空间环境变量的初始化)
服务器环境($_SERVER、$_ENV)
请求数据环境($_POST、$_GET、$_COOKIE,$_FILES)
模块请求初始化(PHP通过zend_activate_modules函数,遍历注册在module_registry变量中的所有模块,调用其RINIT方法实现模块的请求初始化操作)
执行
php文件解析执行
前置执行文件
执行主文件(zend_compile_file(compile_file函数))
词法分析
语法分析
生成中间码(调用zend_execute(execute函数)执行中间代码)
处理异常(调用用户定义的异常处理函数)
PHP通过EG(return_value_ptr_ptr)返回结果
后置执行文件
结束阶段
DEACTIVATION
调用所有通过register_shutdown_function()注册的函数。这些在关闭时调用的函数是在用户空间添加进来的。
执行所有可用的__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引擎。)
关闭所有的模块(会调用模块的module_shutdown_func方法,即PHP_RSHUTDOWN_FUNCTION宏产生的那个函数)
销毁全局函数表
销毁全局类表
销毁全局变量表
过zend_shutdown_extensions遍历zend_extensions所有元素,调用每个扩展的shutdown函数。
收藏
0 条评论
下一页