10.生命周期和Zend引擎

本文详细介绍了PHP的生命周期,从初始化到结束的整个过程,并深入探讨了Zend引擎在各阶段的作用,包括模块初始化、激活、运行、失活及结束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.模块初始化节点(minit)   启动
	1.初始化若干全局变量
	2.初始化若干常量
	3.初始化 Zend 引擎和核心组件
	4.解析 php.ini
		1.判断是否有php_ini_path_override,在CLI模式下可以通过-c参数指定此路径(在php的命令参数中-c表示在指定的路径中查找ini文件)
		2.如果没有php_ini_path_override,判断php_ini_ignore是否为非空(忽略php.ini配置,这里也就CLI模式下有用,使用-n参数)
		3.如果不忽略ini配置,则开始处理php_ini_search_path(查找ini文件的路径),这些路径包括CWD(当前路径,不过这种不适用CLI模式)、             执行脚本所在目录、环境变量PATH和PHPRC和配置文件中的PHP_CONFIG_FILE_PATH的值。
		4.在准备完查找路径后,PHP会判断现在的ini路径(php_ini_file_name)是否为文件和是否可打开。 如果这里ini路径是文件并且可打开,则会使用此文件, 也就是CLI模式下通过-c参数指定的ini文件的优先级是最高的, 其次是PHPRC指定的文件,第三是在搜索路径中查找php-%sapi-module-name%.ini文件
		(如CLI模式下应该是查找php-cli.ini文件), 最后才是搜索路径中查找php.ini文件。
	5.全局操作函数的初始化
	6.初始化静态构建的模块和共享模块(MINIT)
	7.禁用函数和类


2.模块激活阶段(rinit)  激活
	1.激活Zend引擎
	2.激活SAPI
	3.环境初始化
	4.模块请求初始化

3.运行  

4.rshutdown   失活
	1.调用所有通过register_shutdown_function()注册的函数。这些在关闭时调用的函数是在用户空间添加进来的。 
	  一个简单的例子,我们可以在脚本出错时调用一个统一的函数,给用户一个友好一些的页面,这个有点类似于网页中的404页面。
	2.执行所有可用的__destruct函数。 这里的析构函数包括在对象池(EG(objects_store)中的所有对象的析构函数以及EG(symbol_table)中各个元素的析构方法。
	3.将所有的输出刷出去。
	4.发送HTTP应答头。这也是一个输出字符串的过程,只是这个字符串可能符合某些规范。
	5.遍历每个模块的关闭请求方法,执行模块的请求关闭操作,这就是我们在图中看到的Call each extension's RSHUTDOWN。
	6.销毁全局变量表(PG(http_globals))的变量。
	7.通过zend_deactivate函数,关闭词法分析器、语法分析器和中间代码执行器。
	8.调用每个扩展的post-RSHUTDOWN函数。只是基本每个扩展的post_deactivate_func函数指针都是NULL。
	9.关闭SAPI,通过sapi_deactivate销毁SG(sapi_headers)、SG(request_info)等的内容。
	10.关闭流的包装器、关闭流的过滤器。
	11.关闭内存管理。
	12.重新设置最大执行时间

5.mshutdown  结束
	1.flush
	2.关闭Zend引擎


sapi --- cli :
1. main (argc=2, argv=0x18e2690) at /src/php-7.1.4/sapi/cli/php_cli.c:1381


1.php_module_startup(); // 启动, main.c 2113
	sapi_activate();
	zend_startup();
	php_init_config();

2.php_request_startup();  // 激活, main.c 1626
	zend_activate(); // 激活Zend引擎
	sapi_activate(); // 激活SAPI
	zend_activate_modules(); // 模块请求初始化

3.php_execute_script();  //运行, main.c , 2600
	zend_execute_scripts(); 
	zend_compile_file();
	zend_execute();

4.php_request_shutdown(); // 失活, main.c 1835
	php_call_shutdown_functions(); // 调用所有通过register_shutdown_function()注册的函数
	zend_call_destructors(); // 执行所有可用的__destruct函数
	php_output_end_all(); // 将所有的输出刷出去
	zend_deactivate_modules(); //遍历每个模块的关闭请求方法,执行模块的请求关闭操作,这就是我们在图中看到的Call each extension's RSHUTDOWN。
	zend_deactivate(); // 通过zend_deactivate函数,关闭词法分析器、语法分析器和中间代码执行器。
	zend_post_deactivate_modules(); // 调用每个扩展的post-RSHUTDOWN函数。只是基本每个扩展的post_deactivate_func函数指针都是NULL。
	sapi_deactivate(); 	// 关闭SAPI,通过sapi_deactivate销毁SG(sapi_headers)、SG(request_info)等的内容。
	zend_unset_timeout(); 


5.php_module_shutdown();
	sapi_flush(); // sapi_flush将最后的内容刷新出去。其调用的是sapi_module.flush,在CLI模式下等价于fflush函数。
	zend_shutdown(); // 关闭Zend引擎

这里写图片描述
这里写图片描述
这里写图片描述


这里写图片描述

这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述


这里写图片描述
这里写图片描述
这里写图片描述


1.启动:

 1. 初始化若干全局变量
 2. 初始化若干常量
 3. 初始话zend引擎和核心组件(内存管理初始化,全局使用的函数指针的初始化,对PHP源文件进行词法分析,语法分析,中间代码执行的函数指针的赋值,初始化若干hashtable,为ini文件解析做准备,为php源文件解析做准备,注册内置函数(strlen),注册标准常亮(E_ALL),注册global全局变量)
 4. 解析 php.ini(php_init_config()读取php.ini,1.判断是否有php_ini_path_override, -C; 2.php_ini_ignore -n; 3.php_ini_search_path(查找php.ini路径);4.php_ini_file_name,判断ini文件是否为文件,是否可打开)
 5. 全局操作函数的初始化
 6. 初始化静态构建的模块和共享模块(minit)
 7. 禁用函数和类

2.activation(激活):

 1. 激活zend引擎
 2. 激活 sapi
 3. 环境初始化
 4. 模块请求初始化

3.运行:
php_execute_script,当一个php文件需要解析执行,它可能会需要执行3个文件,前置执行文件(auto_prepend_file),需要执行的主文件,后置执行文件(auto_append_file)

4.deactivation(使失效):

PHP 关闭请求的过程是一个若干关闭操作的集合,存在于php_request_shutdown()中.包含如下:

  1. 调用所有 通过 register_shudown_function()注册的函数,为用户注册的
  2. 执行所有的__desctruct() 函数
  3. 将所有的输出刷出去
  4. 发送 HTTP 应答头
  5. 遍历每个模块的关闭请求方法,RSHUTDOWN()
  6. 销毁全局变量表的变量
  7. 通过 zend_deactivate,关闭词法分析器,语法分析器,中间代码执行器
  8. 调用每个扩展的 post_RSHUTDOWN
  9. 关闭 sapi,通过 sapi_deactivate
  10. 关闭流的包装器,过滤器
  11. 关闭内存管理
  12. 重新设置最大执行时间

5.结束:

  1. flush ,sapi_module.flush
  2. 关闭 zend 引擎,zend_shutdown

http://www.php-internals.com/book/?p=chapt02/02-01-php-life-cycle-and-zend-engine

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值