PHP的构成及生命周期_php返回数据结构中生命周期时间-程序员宅基地

技术标签: PHP内核  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 钩子函数。

 

注:免费领取阿里云产品优惠券:https://www.haveyb.com/aliyun

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m_nanle_xiaobudiu/article/details/94467913

智能推荐

html矩形框填充颜色的代码,js canvas绘制填充填充矩形添加边框颜色-程序员宅基地

文章浏览阅读2.2k次。效果图:源码:html>canvas绘制填充矩形//绘制无填充矩形varmy1=document.getElementById("mycanvas");//访问mycanvasvarctx=my1.getContext("2d");//这个参数不需要改动ctx.beginPath();//创建路径ctx.lineWidth=5;//边框大写,也就是描边ctx.strokeSt..._js 绘制带边框的填充矩形 linewidth

Dynamic Proxy模式_dyproxy-程序员宅基地

文章浏览阅读966次。 Dynamic Proxy 是JDK 1.3 版本中新引入的一种代理机制。严格来讲,Dynamic Proxy本身并非一种模式,只能算是Proxy 模式的一种动态实现方式,不过为了与传统Proxy 模式相区分,这里暂且将其称为“Dynamic Proxy 模式”来泛指通过Dynamic Proxy 机制实现的Proxy 模式。 通过Decorator模式,我们可以改写接口_dyproxy

【Cisco Packet Tracer】运输层端口与DHCP的作用_cisco dhcp端口-程序员宅基地

文章浏览阅读1.7w次,点赞81次,收藏65次。这篇文章摘要将介绍人工智能在医疗领域的应用。随着技术的迅猛发展,人工智能在医疗诊断、治疗和研究方面展现出巨大的潜力。我们将深入探讨人工智能在医学影像解读上的应用,如何通过深度学习算法提高医生对X光、MRI等图像的准确性。_cisco dhcp端口

JavaScript----闭包函数-程序员宅基地

文章浏览阅读3.2k次,点赞5次,收藏16次。闭包函数 作用域链 优缺点_闭包函数

时序分解 | EEMD集合经验模态分解时间序列信号分解Matlab实现_eemd matlab-程序员宅基地

文章浏览阅读953次,点赞19次,收藏14次。信号去噪是信号处理中的一个重要课题,其目的是从含有噪声的信号中提取出有用信号。近年来,经验模态分解(EMD)算法因其在信号去噪方面的优异性能而备受关注。然而,传统EMD算法存在分解结果不稳定、易受噪声影响等问题。为了克服这些问题,本文提出了一种基于总体平均经验模态分解(EEMD)算法的信号去噪方法。_eemd matlab

Android腾讯微薄客户端开发八:微博查看(转播,对话,点评)-程序员宅基地

文章浏览阅读86次。Android如果是自己的微博,可以干掉它下面三幅图是转播,对话以及点评界面Java代码publicclassWeiboDetailActivityextendsActivity{privateDataHelperdataHelper;privateUserInfouser;p...

随便推点

手动上传snapshot和第三方jar包到nexus3-程序员宅基地

文章浏览阅读1.3k次。1、新建repositorysnapshot和第三方jar包的repository的类型是hosted且Version pollcy是Mixed,否则无法上传。2、手动上传选择jar包手动上传即可转载于:https://www.cnblogs.com/MakeInstall/p/11041262.html..._nexus修改snapshots可以支持手工上传jar

基于matlab的稀疏表示KSVD算法图像去噪_字典学习 稀疏编码 图像去噪-程序员宅基地

文章浏览阅读441次。稀疏表示KSVD算法是图像去噪问题中比较有效的方法之一,本文将详细介绍在matlab平台上如何使用KSVD算法进行图像去噪,并提供完整的源代码。KSVD算法是一种基于字典的稀疏表达方法,其核心思想是将待处理图像分解为一些基础元素的线性组合形式,即通过求解一个优化问题,来获取合适的基础元素和系数表达式。稀疏编码则负责计算每个字典元素的系数,使得最终重构得到的图像与原始图像之间的误差最小。2)初始化字典D,通常采用大小为[KxN]的随机矩阵,其中K表示字典中元素的数量,N表示图像块的大小。_字典学习 稀疏编码 图像去噪

golang基础 第3章 (struct,函数,方法,接口,泛型,类型集,类型)_go 泛型 struct-程序员宅基地

文章浏览阅读1k次,点赞19次,收藏25次。golang 基础之struct func 方法 接口 泛型_go 泛型 struct

socket.io-client的4.0封装使用-程序员宅基地

文章浏览阅读4.3k次,点赞2次,收藏10次。socket.io-client的二次封装,4.0版本,含有心跳连接、连接超时、连接错误等监听_socket.io-client

git基础教程(21)git restore还原改动-程序员宅基地

文章浏览阅读8.3k次,点赞3次,收藏2次。git restore <file>表示将在工作空间但是不在暂存区的文件撤销更改.git restore --staged <file>作用是将暂存区的文件从暂存区撤出,但不会更改文件。演示1:1、仓库初始状态:干净的仓库,下面有一个readme文件小静静@DESKTOP-MD21325 MINGW64 /d/test1/test1 (master)$ git statusOn branch masterYour branch is up to date with_git restore

远古项目实战丨用Python一秒搞定垃圾分类_python垃圾分类-程序员宅基地

文章浏览阅读1.7k次,点赞4次,收藏18次。这是一个严肃又欢乐的七月,哲学界迎来新拷问。传统古典哲学的代表,是门口的保安大叔,他提出了三个经典问题:“你是谁?你从哪儿来?要到哪儿去?而后现代主义哲学的四位代表人物冒了出来,发出直指人内心的提问。食堂大妈:你要饭吗?配钥匙师傅:你配吗?算命先生:你算什么东西?滴滴司机:你搞清楚自己的定位没有?从本月起,魔都正式步入生活垃圾强制分类的时代。个人一旦违规混合投放垃圾,将被处以最高200元的罚款。新兴哲学代表垃圾分类阿姨正式上岗:你是什么垃圾?_python垃圾分类

推荐文章

热门文章

相关标签