PHP的生命周期

本文详细介绍了PHP的生命周期,包括SAPI概念、五个执行阶段以及在FPM和CLI模式下的不同。此外,深入探讨了Laravel框架的生命周期,重点解析了从index.php开始,加载composer,生成容器,处理请求直到返回数据的整个过程。强调了HTTP内核的中间件处理和路由分发机制,展示了Laravel如何确保请求的安全性和高效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1:sapi概念:

php最外层,负责和外层交互,使得php核心不用关心和各个应用交互的细节。不同的环境比如fpm,cli。

2:5个阶段:

fpm只会在第一次执行5个阶段,后面重复2-4.命令行界面每次都会执行5个阶段

模块初始化:加载全局符号表,初始化zend引擎

请求初始化:激活zend引擎,重置垃圾回收

请求执行:zend虚拟机上编译运行(laravel框架执行的阶段)

请求关闭:输出内容清理变量

模块关闭:资源清理,关闭php各个模块

3:扩展Larvel框架的生命周期

WEB模式和CLI(命令行)模式很相似,区别是:

CLI 模式会在每次脚本执行经历完整的5个周期,因为你脚本执行完不会有下一个请求;

WEB模式为了应对并发,可能采用多线程,因此生命周期1和5有可能只执行一次,下次请求到来时重复2-4的生命周期,这样就节省了系统模块初始化所带来的开销

Laravel

可以看出PHP生命周期是很对称的,Laravel仅仅运行在 第个阶段:

laravel单例,每一次请求变量都会重置,静态变量也是,虽然多次调用结过不一样,但是多次请求会重置

四个阶段:

index.php开始

-》加载composer

-》生成容器

-》处理请求(加载配置,全局中间件,路由,路由中间件,具体的类方法)

-》请求结束,返回数据

第一步:注册加载composer自动生成的class loader

就是加载初始化第三方依赖。

第二步:生成容器 Container

并向容器注册核心组件,是从 bootstrap/app.php 脚本获取 Laravel 应用实例。

第三步:这一步是重点,处理请求,并生成发送响应。

请求被发送到 HTTP 内核或 Console 内核,这取决于进入应用的请求类型。 是通过浏览器请求还是通过控制台请求。这里我们主要是通过浏览器请求。

HTTP 内核的标志性方法 handle处理的逻辑相当简单:获取一个 Request,返回一个 Response,把该内核想象作一个代表整个应用的大黑盒子,输入 HTTP 请求,返回 HTTP 响应。

1. 首先 Bootstrap 检测环境,加载 bootstrapper数组中的一些配置

HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类,该类定义了一个 bootstrappers 数组,这个数组中的类在请求被执行前运行,这些 bootstrappers 配置了错误处理、日志、检测应用环境以及其它在请求被处理前需要执行的任务。

注意顺序:

Facades 先于ServiceProviders,Facades也是重点,后面说,这里简单提一下,注册 Facades 就是注册 config\app.php中的aliases 数组,你使用的很多类,如Auth,Cache,DB等等都是Facades;而ServiceProviders的register方法永远先于boot方法执行,以免产生boot方法依赖某个实例而该实例还未注册的现象。

HTTP 内核还定义了一系列所有请求在处理前需要经过的 HTTP 中间件,这些中间件处理 HTTP 会话的读写、判断应用是否处于维护模式、验证 CSRF 令牌等等。

2. 第一堵墙,全局中间件,默认为 CheckForMaintenanceMode

在Laravel基础的服务启动之后,就要把请求传递给路由了。路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。

传递方式

传递给路由是通过 Pipeline(管道)来传递的,但是Pipeline有一堵墙,在传递给路由之前所有请求都要经过,这堵墙定义在app\Http\Kernel.php中的$middleware数组中,没错就是中间件,默认只有一个CheckForMaintenanceMode中间件,用来检测你的网站是否暂时关闭。这是一个全局中间件,所有请求都要经过,你也可以添加自己的全局中间件。

3. 然后遍历所有注册的路由,找到最先符合的第一个路由

然后遍历所有注册的路由,找到最先符合的第一个路由,

4. 第二堵墙,通过该路由的中间件(组)

经过该路由中间件,进入到控制器或者闭包函数,执行你的具体逻辑代码。

所以,当请求到达你写的代码之前,Laravel已经做了大量工作,请求也经过了千难万险,那些不符合或者恶意的的请求已被Laravel隔离在外。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值