温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

PHP中请求的生命周期有哪些

发布时间:2021-06-22 17:40:37 来源:亿速云 阅读:172 作者:Leah 栏目:编程语言

这篇文章给大家介绍PHP中请求的生命周期有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

PHP的运行模式

1.cli:命令行模式

2.CGI(common gateway interface): 公共网关接口

   当一个服务web-service(nginx)分配过来请求的时候,通过匹配后缀是动态的php的请求。CGI就会去读取php.ini的基本配置信息,初始化环境,创建进程,返回数据,退出进程。每一次请求都是循环往复,所以有些繁琐,这是后面为什么会诞生fastcgi的原因。

3. fastcgi (fast cgi): cgi的改进版

   3.1当web服务器启动时载入fastcgi管理器。

   3.2.fastcgi自动初始化,创建fastcgi主进程和多个cgi解析器进程,等待来着web服务器的请求(只初始化一次,还有个好处,数据库可以持续化连接)。

   3.3当请求web服务器时,通过匹配后缀是动态的php请求,web服务器通过socket请求fastcgi进程管理器,fastcgi进程管理器,选择一个cgi解析器,web服务器将cgi环境变量和标准输入发送fastcgi子进程php-cgi.

 3.4fastcgi子进程处理完后将标准的输出和错误从同一个连接返回给web服务器,当fastcgi子进程结束后请求就结束了,fastcgi子进程接着等待处理来自fastcgi进程管理器的下一个连接,在CGI模式中,php-cgi.在此便退出了。

4. mod_php:

即Apache运行PHP的默认方式,将PHP作为web服务器的子进程控制,mod_php模式运行PHP,意味着PHP是作为Apache的一个模块来启动的,因此只有在Apache启动的时候会读取php.ini配置文件并加载扩展模块,在Apache运行期间是不会再去读取和加载扩展模块的

PHP现在流行的两种运行模式是FPM模式、CLI模式。

PHP脚本执行的开始,都是通过SAPI接口进行的


第一阶段:SAPI接口,模块初始化阶段

SAPI是什么?

Server Application Programming Interface 服务端应用编程接口

这是 PHP 内核提供给外部调用其服务的接口,即外部系统可以通过 SAPI 来调用 PHP 提供的编译脚本、执行脚本的服务。

SAPI提供给了外部应用跟php通信的管道,这个外部应用包括不限于Apache,httpd,liunx终端等

PHP 中实现的 SAPI 有很多,CLI、FPM 是我们比较常见的。

PHP中请求的生命周期有哪些

在使用Apache作为Web服务器的时候:

PHP总是作为Apache的模块,随着Apache的启动而运行的。

当给定的SAPI启动时,PHP进入初始化内核子系统,主要对PHP框架,zend引擎的初始化操作,这个阶段一般是在SAPI启动时执行一次。

在使用Nginx作为Web服务器的时候:

因为Nginx不能直接和PHP通信,所以他们之间要通过 fast-cgi 协议才能互相理解。

php-fpm 即 php-Fastcgi Process Manager,是 FastCGI 的实现,并提供了进程管理的功能。

对于php-fpm而言,就是在master进程启动时执行,加载PHP拓展,并调用模块初始化例程 MINIT , 这使得每个扩展可以初始化内部变量、分配资源、注册资源处理器,以及向zend注册自己的函数,以便于脚本调用这其中的函数时候zend知道执行哪些代码。再预先fork 多个 worker 进程,accept请求并执行。

worder 进程的生命周期如下图:

PHP中请求的生命周期有哪些

第二阶段:请求初始化阶段

当一个请求发生时,在处理请求前需要经历的一个阶段 :

  1. Nginx 解析一个请求

  2. 当符合php脚本请求的规则的时候,会把这个请求交给反向代理中的fast-cgi模块

  3. Nginx 的 fast-cgi 模块会遵循 fast-cgi协议 将这个请求转发给 proxy_pass 指定的上游服务:php-fpm

  4. SAPI层将控制权交给PHP层。于是PHP设置了用于回复本次请求所需的环境变量。同时,它还建立一个变量表,用来存放执行过程 中产生的变量名和值。PHP调用各个模块的RINIT方法,即“请求初始化”。一个经典的例子是Session模块的RINIT,如果在php.ini中 启用了Session模块,那在调用该模块的RINIT时就会初始化$_SESSION变量,并将相关内容读入;RINIT方法可以看作是一个准备过程, 在程序执行之间就会自动启动。


第三阶段:php脚本执行阶段

php代码解析执行的过程,Zend引擎接管控制权。

  1. Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens) (扫描–语言片段)

  2. Parsing, 将Tokens转换成简单而有意义的表达式(解析–表达式)

  3. Compilation, 将表达式编译成Opocdes(编码-opcodes)

  4. Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。(执行opcodes)


第四阶段:请求结束阶段

请求处理完成后,就进入了 结束阶段。

  1. 执行flush,输出响应内容

  2. PHP启动清理程序,它会按顺序调用各个模块的RSHUTDOWN方法。 RSHUTDOWN用以清除程序运行时产生的符号表,执行垃圾清理过程,也就是对每个变量调用unset函数。

  3. worker进程关闭该请求连接,继续等待 accept下一个请求。

关于PHP中请求的生命周期有哪些就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI