php 的生命周期[通俗易懂]

php 的生命周期

大家好,又见面了,我是全栈君。

1、PHP的运行模式:

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

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

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

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

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

多线程模式

简要的执行过程:

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层,最终输出到浏览器上。

2. 运行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 方法

3. 各种情况下的SAPI生命周期。

1. 单进程SAPI生命周期。(CGI)

CLI/CGI模式的PHP属于单进程的SAPI模式。这类的请求在处理一次请求后就关闭。也就是说每次请求都会重复这几个环节: 开始 – 请求开始 – 请求关闭 – 结束 。可以看到扩展的初始化花费了很多资源。

2. 多进程SAPI生命周期。(MPM的perfork方式)

通常PHP是编译为apache的一个模块来处理PHP请求(mod_php)。Apache一般会采用多进程模式, Apache启动后会fork出多个子进程(apache里可以指定开始fork出来的进程数)。每个进程的内存空间独立,每个子进程刚被fock出来都会经过开始和结束环节。

113023_uXRc_1384334.png

3. 多线程的SAPI生命周期。(FastCGI或者MPM的work方式里的单个进程)

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

113317_UFqo_1384334.png

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112257.html原文链接:https://javaforall.net

(0)
上一篇 2022年2月8日 下午12:00
下一篇 2022年2月8日 下午12:00


相关推荐

  • 汇编寄存器英文解释

    汇编寄存器英文解释AH amp AL AX accumulator 累加寄存器 BH amp BL BX base 基址寄存器 CH amp CL CX count 计数寄存器 DH amp DL DX data 数据寄存器 SP StackPointer 堆栈指针寄存器 BP BasePointer 基址指针寄存器 SI SourceIndex 源变址寄存器

    2026年3月18日
    2
  • python astype str_Python astype(np.float)函数使用方法解析

    python astype str_Python astype(np.float)函数使用方法解析我的数据库如图结构我取了其中的nameagenr,做成array,只要所取数据存在str型,那么取出的数据,全部转化为str型,也就是array阵列的元素全是str,不管数据库定义的是不是int型。那么问题来了,取出的数据代入公式进行计算的时候,就会类型不符,这是就用到astype(np.float)代码如下importpymysqlimportnumpyasnpconn=pymy…

    2022年6月3日
    119
  • mysql 截取字符串部分值_mysql截取字符串取值

    mysql 截取字符串部分值_mysql截取字符串取值使用mysql过程中根据实际业务的开发需求和表的设计有时候我们需要在sql中根据某个字符串截取并且取值:demo如下:ifnull(max(SUBSTRING_INDEX(c.check_score,’,’,-1)),’-‘)swjdf//按照,截取check_score这个字段的值,-1取的是倒数第一位即最后一位SUBSTRING_INDEX函数语法:SUBSTRING_INDEX(str…

    2022年6月11日
    139
  • dubbo负载均衡策略(XML、注解、SpringBoot配置)「建议收藏」

    dubbo负载均衡策略(XML、注解、SpringBoot配置)「建议收藏」本示例是在上一篇文章中搭建的实例来讲解,详情先查看:SpringBoot集成dubbo最新实战教程:dubbo-spring-boot-starter一.简介在集群负载均衡时,Dubbo提供了多种均衡策略,默认为random随机调用。二.负载均衡策略1.RandomLoadBalance随机,按权重设置随机概率。 在一个截面上碰撞的概率高,但调用量越大分布越均…

    2022年7月27日
    5
  • 无显示屏 配置树莓派教程[通俗易懂]

    无显示屏 配置树莓派教程[通俗易懂]<无显示屏>配置树莓派教程0.相关链接#SDCardFormatter官网下载链接https://www.sdcard.org/downloads/formatter/eula_windows/index.html#Win32DiskImager下载链接https://sourceforge.net/projects/win32diskimager/#树莓派…

    2022年8月31日
    11
  • 安装淘宝镜像的命令_树莓派安装使用淘宝镜像

    安装淘宝镜像的命令_树莓派安装使用淘宝镜像​使用我们定制的cnpm(gzip压缩支持)命令行工具代替默认的npm:npminstall-gcnpm–registry=https://registry.npm.taobao.org

    2025年8月22日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号