您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

PHP的构成及生命周期是什么?

2024/4/15 12:39:25发布13次查看
我们学习了解了这么多关于php的知识,不知道你们对他的构成以生命周期是否已经完全掌握了呢,如果没有,那就跟随本篇文章一起继续学习吧
一、php开源源代码下载地址:
https://github.com/php/php-src.git
二、php的构成
1、目录结构
2、目录分析
(1)sapi目录是php的应用接口层。
(2)main为php的主要代码,主要是输入/输出、web通信、php框架的初始化操作等,比如fastcgi协议的解析、扩展的加载、php配置的解析等工作都是在这里完成的。
(3)zend目录是php解析器的主要实现,即zendvm,它是php语言的核心实现,php代码的解释、执行都是由zend完成的。
(4)ext目录是php的扩展目录,比如php的curl扩展,gd库扩展、pdo扩展等都是在这里。
(5)tsrm目录为线程安全相关的实现。
(6)php各组成部分之间关系图:
3、sapi
(1)php是一个脚本解析器,提供脚本的解析与执行。它的输入是普通的文本,然后由php解析器按照预先定义好的语法规则进行解析执行。我们可以在不同环境中应用这个解析器,比如命令行下、web环境下、嵌入其他应用中使用。为此,php提供了一个sapi层以适配不同的应用环境,sapi可以认为是php的宿主环境。
(2)sapi也是整个php框架最外层的一部分,它主要负责php框架的初始化工作。sapi代码位于php源码的 /sapi 目录下,经常用到的两个sapi是cli和fpm。
4、zendvm
(1)zendvm是一个虚拟的计算机,它介于php应用和实际计算机中间,我们编写的php代码就是被它解释执行的。zendvm是php语言的核心实现,他主要由两部分组成:编译器和执行器。
(2)编译器负责将php解释为执行器可识别的指令,执行器负责执行编译器解释出的指令。
(3)zendvm的角色等同于java中的jvm,它们都是抽象出的虚拟计算机。
5、extension
(1)扩展是php内核提供的一套用于扩充php功能的一种方式,php社区中有丰富的扩展可供使用,这些扩展为php提供了大量实用的功能,php中很多操作的函数都是通过扩展提供的。
(2)通过扩展,我们可以使用c/c++实现更强大的功能和更高的性能。扩展分为php扩展和zend扩展,php扩展比较常见,而zend扩展主要应用于zendvm,我们所熟知的opcache就是zend扩展。
三、php生命周期
1、php的整个生命周期被划分为以下几个阶段:
(1)模块初始化阶段(module startup)
(2)请求初始化阶段(request startup)
(3)脚本执行阶段(execute sccript)
(4)请求关闭阶段(request shutdown)
(5)模块关闭阶段(module shutdown)
注:根据不同sapi的实现,各阶段的执行情况会有一些差异,比如命令行模式下,每次执行一个脚本都会完成的经历这些阶段。而fastcgi模式下则在启动时执行一次模块初始化,然后各个请求只经历请求初始化,脚本执行,请求关闭几个阶段,在sapi关闭时,才经历模块关闭阶段。
2、模块初始化阶段—分析
(1)这个阶段主要进行php框架和zend引擎的初始化操作。该阶段的入口函数为php_module_startup()。这个阶段一般只在sapi启动时执行一次,对于fpm而言,就是在fpm的master进程启动时执行的。
(2)该阶段的几个主要处理如下:
(3)激活sapi:sapi_activate(),初始化请求信息sg(request_info)、设置读取post请求的handle等。
(4)启动php输出:php_output_startup()
(5)初始化垃圾回收器:gc_globals_ctor(),并分配zend_gc_globals内存。
(6)启动zend引擎:zend_startup(),主要操作包括
      (6.1)启动内存池 start_memory_manager()
      (6.2)设置一些util函数句柄,如zend_error_cb、zend_pringf、zend_write等。
      (6.3)设置zend虚拟机编译、执行器的函数句柄zend_compile_file、zend_execute_ex、垃圾回收函数句柄gc_collect_cycles
       (6.4)分配函数符号表 方法符号表(function_table)、类符号表(class_table)、常量符号表(zend_constants)等,如果是多线程的话,还会分配编译器、执行器的全局变量。
       (6.5)注册zend核心扩展:zend_startup_builtin_funtions(),这个扩展是内核提供的,该过程将注册zend核心扩展提供的函数,如strlen、define、func_get_args、class_exists等。
       (6.6)注册zend定义的标准常量:zend_register_standard_constants(),比如 e_error、e_warning、e_all、true、false等。
       (6.7)注册$globals超全局变量的获取handle。
       (6.8)分配php.ini配置的存储符号表 eg(ini_directives)。
(7)注册php定义的常量:php_version、php_zts、php_sapi等。
(8)解析php.ini:解析完成后所有的php.ini配置保存在configuration_hash哈希表中。
(9)映射php、zend核心的php.ini配置:根据解析出的php.ini,获取对应的配置值,将最终的配置插入eg(ini_directives)哈希表。
(10)注册用于获取$_get、$_post、$_cookie、$_server、$_env、$_request、$_files变量的handle。
(11)注册静态编译的扩展:php_register_internal_extensions_func()。
(12)注册动态加载的扩展:php_init_register_extensions(),将php.ini中配置的扩展加载到php中。
(13)回调各扩展定义的module startup钩子函数,即通过php_minit_function()定义的函数。
(14)注册php.ini中禁用的函数、类:disable_funstions、disable_classes。
3、请求初始化阶段—分析
该阶段是在请求处理前每一个请求都会经历的一个阶段。对于fpm而言,是在worker进程accept一个请求且获取、解析完请求数据后的一个阶段。该阶段的处理函数为php_request_startup()。
主要处理有以下几个:
(1)激活输出:php_output_activate()
(2)激活zend引擎:zend_activate(),主要操作有
      (2.1)重置垃圾回收器:gc_reset()
      (2.2)初始化编译器:ini_compiler()
      (2.3)初始化执行器:ini_exexutor(),将 eg(function_table)和 eg(class_table)分别执行 cg(function_table)和cg(class_table)。
      (2.4)初始化全局变量符号表 eg(symbol_table)、include过的文件符号表 eg(included_files)
      (2.5)初始化词法扫描器:sapi_activate()
(3)激活sapi:sapi_activate()
(4)回调个扩展定义的request startup钩子函数:zend_activate_modules()
4、脚本执行阶段—分析
(1)该阶段包括php代码的编译、执行两个核心阶段,这也是zend引擎最重要的功能。
(2)在编译阶段,php脚本将经历从php源代码到抽象语法树,再到opline指令的转化过程,最终生成的opline指令就是zend引擎可识别的执行指令,这些指令被执行器执行,这就是php代码解释执行的过程。该阶段入口函数为php_execute_script()。
5、请求关闭阶段—分析
(1)该阶段将flush输出内容、发送http应答header头、清理局部变量、关闭编译器、关闭执行器等。
(2)另外,在该阶段将回调各扩展的request shutdown钩子函数。
(3)该阶段与请求初始化阶段操作是相反的。
6、模块关闭阶段—分析
该阶段在sapi关闭时执行,与模块初始化阶段对应,主要进行资源的清理、php各模块的关闭操作,同时将回调各扩展的 module shutdown 钩子函数。
 推荐学习:《php视频教程》
以上就是php的构成及生命周期是什么?的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product