返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php的生命周期有哪些
  • 630
分享到

php的生命周期有哪些

2023-06-14 14:06:03 630人浏览 安东尼
摘要

这期内容当中小编将会给大家带来有关PHP的生命周期有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、Per

这期内容当中小编将会给大家带来有关PHP的生命周期有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

php有什么用

php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、Perl以及php自创新的语法,主要用来做网站开发,许多小型网站都用php开发,因为php是开源的,从而使得php经久不衰。

1、PHP的运行模式

 PHP两种运行模式是WEB模式、CLI模式。无论哪种模式,PHP工作原理都是一样的,作为一种Sapi运行。

当我们在终端敲入php这个命令的时候,它使用的是CLI。

它就像一个web服务器一样来支持php完成这个请求,请求完成后再重新把控制权交给终端。

当使用Apache或者别web服务器作为宿主时,当一个请求到来时,PHP会来支持完成这个请求。一般有:

  • 多进程(通常编译为apache的模块来处理PHP请求)

  •  多线程模式

2、一切的开始: SAPI接口

通常我们编写php Web程序都是通过Apache或者Nginx这类Web服务器来测试脚本. 或者在命令行下通过php程序来执行PHP脚本. 执行完成脚本后,服务器应答,浏览器显示应答信息,或者在命令结束后在标准输出显示内容. 我们很少关心PHP解释器在哪里. 虽然通过Web服务器和命令行程序执行脚本看起来很不一样. 实际上她们的工作是一样的. 命令行程序和Web程序类似, 命令行参数传递给要执行的脚本,相当于通过url 请求一个PHP页面. 脚本戳里完成后返回响应结果,只不过命令行响应的结果是显示在终端上. 脚本执行的开始都是通过SAPI接口进行的. 

启动apache

当给定的SAPI启动时,例如在对/usr/local/apache/bin/apachectl start的响应中,PHP由初始化其内核子系统开始。在接近启动例程的末尾,它加载每个扩展的代码并调用其模块初始化例程(MINIT)。这使得每个扩展可以初始化内部变量、分配资源、注册资源处理器,以及向ZE注册自己的函数,以便于脚本调用这其中的函数时候ZE知道执行哪些代码。

请求处理初始化

接下来,PHP等待SAPI层请求要处理的页面。对于CGI或CLI等SAPI,这将立刻发生且只发生一次。对于Apache、IIS或其他成熟的web服务器SAPI,每次远程用户请求页面时都将发生,因此重复很多次,也可能并发。不管请求如何产生,PHP开始于要求ZE建立脚本的运行环境,然后调用每个扩展的请求初始化 (RINIT)函数。RINIT使得扩展有机会设定特定的环境变量,根据请求分配资源,或者执行其他任务,如审核。 session扩展中有个RINIT作用的典型示例,如果启用了session.auto_start选项,RINIT将自动触发用户空间的session_start()函数以及预组装$_SESSION变量。

执行php代码

一旦请求被初始化了,ZE开始接管控制权,将PHP脚本翻译成符号,最终形成操作码并逐步运行之。如任一操作码需要调用扩展的函数,ZE将会把参数绑定到该函数,并且临时交出控制权直到函数运行结束。

脚本结束

脚本运行结束后,PHP调用每个扩展的请求关闭(RSHUTDOWN)函数以执行最后的清理工作(如将session变量存入磁盘)。接下来,ZE执行清理过程(垃圾收集)-有效地对之前的请求期间用到的每个变量执行unset()。

sapi关闭

一旦完成,PHP继续等待SAPI的其他文档请求或者是关闭信号。对于CGI和CLI等SAPI,没有“下一个请求”,所以SAPI立刻开始关闭。关闭期间,PHP再次遍历每个扩展,调用其模块关闭(MSHUTDOWN)函数,并最终关闭自己的内核子系统。

简要的过程如下:

1. PHP是随着Apache的启动而运行的;
2. PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口);
3. PHP总共有三个模块:内核、Zend引擎、以及扩展层;
4. PHP内核用来处理请求、文件流、错误处理等相关操作;
5. Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;
6. 扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要mysql扩展来连接Mysql数据库
7. 当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;
8. 最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。

3、PHP的开始和结束阶段

开始阶段有两个过程:

第一个过程:apache启动的过程,即在任何请求到达之前就发生。是在整个SAPI生命周期内(例如Apache启动以后的整个生命周期内或者命令行程序整个执行过程中)的开始阶段(MINIT),该阶段只进行一次.。启动Apache后,PHP解释程序也随之启动; PHP调用各个扩展(模块)的MINIT方法,从而使这些扩展切换到可用状态。看看php.ini文件里打开了哪些扩展吧; MINIT的意思是“模块初始化”。各个模块都定义了一组函数、类库等用以处理其他请求。 模块在这个阶段可以进行一些初始化工作,例如注册常量, 定义模块使用的类等等.典型的的模块回调函数MINIT方法如下:

PHP_MINIT_FUNCTION(myphpextension) {  }{    // 注册常量或者类等初始化操作    return SUCCESS; }

第二个过程发生在请求阶段,当一个页面请求发生时.则在每次请求之前都会进行初始化过程(RINIT请求开始).

请求到达之后,SAPI层将控制权交给PHP层,PHP初始化本次请求执行脚本所需的环境变量,例如创建一个执行环境,包括保存php运行过程中变量名称和变量值内容的符号表. 以及当前所有的函数以及类等信息的符号表.例如是Session模块的RINIT,如果在php.ini中启用了Session 模块,那在调用该模块的RINIT时就会初始化$_SESSION变量,并将相关内容读入;  然后PHP会调用所有模块RINIT函数,即“请求初始化”。 在这个阶段各个模块也可以执行一些相关的操作, 模块的RINIT函数和MINIT函数类似 ,RINIT方法可以看作是一个准备过程,在程序执行之间就会自动启动。

PHP_RINIT_FUNCTION(myphpextension){    // 例如记录请求开始时间    // 随后在请求结束的时候记录结束时间.这样我们就能够记录下处理请求所花费的时间了    return SUCCESS; }

结束阶段分为两个环节:  请求处理完后就进入了结束阶段, 一般脚本执行到末尾或者通过调用exit()或者die()函数,PHP都将进入结束阶段. 和开始阶段对应,结束阶段也分为两个环节,一个在请求结束后(RSHUWDOWN),一个在SAPI生命周期结束时(MSHUTDOWN).

第一个环节:请求处理完后结束阶段:请求处理完后就进入了结束阶段,PHP就会启动清理程序。它会按顺序调用各个模块的RSHUTDOWN方法。 RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。典型的RSHUTDOWN方法如下:

PHP_RSHUTDOWN_FUNCTION(myphpextension){    // 例如记录请求结束时间, 并把相应的信息写入到日至文件中.    return SUCCESS; }

第二个环节:最后,所有的请求都已处理完毕,SAPI也准备关闭了, PHP调用每个扩展的MSHUTDOWN方法,这是各个模块最后一次释放内存的机会。(这个是对于CGI和CLI等SAPI,没有“下一个请求”,所以SAPI立刻开始关闭。)

典型的RSHUTDOWN方法如下:

PHP_MSHUTDOWN_FUNCTION(extension_name) {          return SUCCESS; }

这样,整个PHP生命周期就结束了。要注意的是,只有在服务器没有请求的情况下才会执行“启动第一步”和“关闭第二步”。

SAPI运行PHP都经过下面几个阶段:
1、模块初始化阶段(Module init)     :
即调用每个拓展源码中的的PHP_MINIT_FUNCTION中的方法初始化模块,进行一些模块所需变量的申请,内存分配等。
2、请求初始化阶段(Request init)  :
即接受到客户端的请求后调用每个拓展的PHP_RINIT_FUNCTION中的方法,初始化PHP脚本的执行环境。
3、执行PHP脚本
4、请求结束(Request Shutdown) 
这时候调用每个拓展的PHP_RSHUTDOWN_FUNCTION方法清理请求现场,并且ZE开始回收变量和内存。
5、关闭模块(Module shutdown)     :
Web服务器退出或者命令行脚本执行完毕退出会调用拓展源码中的PHP_MSHUTDOWN_FUNCTION 方法

4、单进程SAPI生命周期

CLI/CGI模式的PHP属于单进程的SAPI模式。这类的请求在处理一次请求后就关闭。也就是只会经过如下几个环节: 开始 - 请求开始 - 请求关闭 - 结束 SAPI接口实现就完成了其生命周期。如图所示:

php的生命周期有哪些

5、多进程SAPI生命周期

通常PHP是编译为apache的一个模块来处理PHP请求。Apache一般会采用多进程模式, Apache启动后会

fork出多个子进程,每个进程的内存空间独立,每个子进程都会经过开始和结束环节, 不过每个进程的开始阶

段只在进程fork出来以来后进行,在整个进程的生命周期内可能会处理多个请求。 只有在Apache关闭或者进程

被结束之后才会进行关闭阶段,在这两个阶段之间会随着每个请求重复请求开始-请求关闭的环节。 

如图所示:

php的生命周期有哪些

6、多线程的SAPI生命周期

多线程模式和多进程中的某个进程类似,不同的是在整个进程的生命周期内会并行的重复着 请求开始-请求关闭的环节

在这种模式下,只有一个服务器进程在运行着,但会同时运行很多线程,这样可以减少一些资源开销,向Module init和Module shutdown就只需要运行一遍就行了,一些全局变量也只需要初始化一次,因为线程独具的特质,使得各个请求之间方便的共享一些数据成为可能。

 多线程工作方式如下图

php的生命周期有哪些

7、Apache一般使用多进程模式prefork

linux下使用#Http –l 命令可以查看当前使用的工作模式。也可以使用#apachectl -l命令。
看到的prefork.c,说明使用的prefork工作模式。

prefork 进程池模型,用在 UNIX 和类似的系统上比较多,主要是由于写起来方便,也容易移植,还不容易出问题。要知道,如果采用线程模型的话,用户线程、内核线程和混合型线程有不同的特性,移植起来就麻烦。prefork 模型,即预先 fork() 出来一些子进程缓冲一下,用一个来控制同步,连接到来了就放行一个子进程,让它去处理。

prefork MPM 使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:他能够使用那些没有处理好线程安全的第三方模块,并 且对于那些线程调试困难的平台而言,他也更容易调试一些。

上述就是小编为大家分享的php的生命周期有哪些了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网PHP编程频道。

--结束END--

本文标题: php的生命周期有哪些

本文链接: https://lsjlt.com/news/271418.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • php的生命周期有哪些
    这期内容当中小编将会给大家带来有关php的生命周期有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、Per...
    99+
    2023-06-14
  • Activity的生命周期有哪些
    这期内容当中小编将会给大家带来有关Activity的生命周期有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Android中Activity的生命周期,网上大多数文章基本都是直接贴图、翻译API,比较...
    99+
    2023-05-31
    activity ct
  • react生命周期的阶段有哪些
    今天小编给大家分享一下react生命周期的阶段有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2024-04-02
  • Angular组件的生命周期有哪些
    这期内容当中小编将会给大家带来有关Angular组件的生命周期有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。概述组件声明周期以及angular的变化发现机制红色方法只执行一次。变更检测执行的绿色方法...
    99+
    2023-06-15
  • JavaScript内存的生命周期有哪些
    这篇文章给大家介绍JavaScript内存的生命周期有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、说明内存分配:当我们申明变量、函数、对象的时候,系统会自动为他们分配内存内存使用:即读写内存,也就是使用变量、...
    99+
    2023-06-15
  • ASP.NET组件的生命周期有哪些
    本篇文章给大家分享的是有关ASP.NET组件的生命周期有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 Instance 实例化通过控件的构造器所实例化。还可以通过被父控件...
    99+
    2023-06-18
  • activity生命周期的方法有哪些
    在Android开发中,Activity的生命周期方法有以下几种:1. onCreate(): 在Activity被创建时调用,用于...
    99+
    2023-09-11
    activity
  • vue的生命周期有哪些阶段
    这篇文章主要讲解了“vue的生命周期有哪些阶段”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue的生命周期有哪些阶段”吧!有4大阶段:1、初始化阶段,包含beforeCreate(创建前)...
    99+
    2023-07-04
  • react的生命周期函数有哪些
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。react的生命周期函数有哪些?react的生命周期函数(超详细)话不多说,直接进入正题!先来了解一下react的生命周期函数有哪些:组件将要挂载时触发的...
    99+
    2023-05-14
    React
  • servlet的生命周期结构有哪些
    servlet的生命周期结构有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Servlet 生命周期:Servlet 加载--->实例化--->...
    99+
    2023-05-31
    servlet 生命周期
  • vue组件生有哪些命周期
    本篇文章给大家分享的是有关vue组件生有哪些命周期,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体内容如下分为4个阶段:create/mou...
    99+
    2024-04-02
  • Vue生命周期函数有哪些
    小编给大家分享一下Vue生命周期函数有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1.BeforeCreate()Vue实例已经创建,但是data,和methods中的数据和方法都未被初始化。就是说你可以在befor...
    99+
    2023-06-22
  • servlet生命周期有哪些阶段
    这篇文章主要介绍了servlet生命周期有哪些阶段的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇servlet生命周期有哪些阶段文章都会有所收获,下面我们一起来看看吧。Servlet生命周期是指servlet从...
    99+
    2023-07-05
  • 小程序中的生命周期有哪些?
    一、小程序中生命周期的分类 小程序中的生命周期有以下三种: (1)应用生命周期 小程序的生命周期函数是在app.js中调用,通过App(Object)函数用来注册一个小程序,指定其小程序的生命周期回调 (2)页面生命周期 页面生命...
    99+
    2023-09-02
    小程序 微信小程序 前端 前端框架 开发语言
  • Vue3中的生命周期函数有哪些
    本篇内容介绍了“Vue3中的生命周期函数有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!生命周期钩子函数每个 Vue 组件实例在创建时都...
    99+
    2023-07-05
  • react新旧生命周期的区别有哪些
    本文小编为大家详细介绍“react新旧生命周期的区别有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“react新旧生命周期的区别有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新...
    99+
    2024-04-02
  • vue的生命周期钩子函数有哪些
    vue的生命周期钩子函数有:1.beforeCreate,对应阶段为创建前;2.created,对应阶段为创建后;3.beforemount,对应阶段为载入前;4.mounted,对应阶段为载入后;5.beforeUpdate,对应阶段为更...
    99+
    2024-04-02
  • vue生命周期包括哪些
    vue生命周期包括:1.创建前,钩子函数为beforeCreate;2.创建后,钩子函数为created;3.载入前,钩子函数为beforemount;4.载入后,钩子函数为mounted;5.更新前,钩子函数为beforeUpdate;6...
    99+
    2024-04-02
  • Vue生命周期的相关知识点有哪些
    这篇文章主要为大家展示了“Vue生命周期的相关知识点有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Vue生命周期的相关知识点有哪些”这篇文章吧。1. 生命周期(重要)1.1 初步认识生命周...
    99+
    2023-06-29
  • java项目中线程的生命周期有哪些
    本篇文章为大家展示了java项目中线程的生命周期有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一个线程的生命周期:新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后...
    99+
    2023-05-31
    java 线程 生命周期
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作