Laravel 生命周期概括起来大致可分为三步
加载依赖及生成实例部分
一个请求进来之后由public/index.php开始也由public/index.php结束,直接打开该入口文件
laravel8的版本生成项目之后相比5.5版本会多出几行代码 maintenance.php,这里的功能是检查网站是否开启了维护模式,是laravel8新特性 可通过命令直接开启或关闭 php artison down 开启维护 php artisan up 关闭维护 页面输出模板可以在resource下的error/503.blade.php自由控制页面输出。
往下大致分为了两个部分 ,加载项目依赖和创建应用实例部分,依赖即引进来的包,着重看app.php创建实例部分
此处主要是生成对应的容器并绑定路径,服务提供者,别名等到容器内,需要注意的是注册了并不代表启动,如下
往下可以看到内核绑定的部分
以http内核为例定义了过滤请求的http中间件,以及配置,异常Facades 和服务提供者和引导程序等
小结:创建实例阶段做了创建 APP 容器、注册应用路径、注册基础服务提供者、配置中间件和引导程序等工作
处理请求部分
还是在入口文件处,自带的解析方法是通过make方法来实例化http内核
实例化内核所做的操作即上面所提到的 注册各种中间件到容器内来过滤请求,后续即到处理请求本身的环节,handle ()处理请求,capture()创建请求的实例
handle的实例化在http内核内已有对应的操作内容,包括
sendRequestThroughRouter()
打开函数可以看到对该请求的具体操作,注册 $request到容器内,清除之前的 $request实例,启动引导程序并将请求发送到路由
看一下引导程序做了什么操作,
功能如上服务提供者的注释
最后请求是交给Pipeline()的方法处理,即管道,定义是将对象传入多个类中执行任何类型的任务,并在所有任务执行完成后一次性返回最终结果
我们看下Pipeline的中间件底层实现,因跳跃比较多,只取最核心的部分,需要先了解array_reduce()
解释里面就能看出来是依次递归调用闭包pipes,堆栈的操作为先进后出,故会调用array_reverse来进行翻转,确保排在前面的中间件能先被执行
之前的handle内有还有两个方法shouldSkipMiddleware() ,只是判定
dispatchToRouter()
之前内核部分已经绑定的route服务在此处会调用dispatch来执行http请求
这部分如果路由的实现是一个控制器,会完成控制器实例化并执行指定方法,如果是函数则会直接调用该函数,此处的功能也就是我们的逻辑处理核心部分,执行结束后会调用已绑定的prepareResponse生成响应并返回
最后回到入口文件处结束会调用send方法来进行返回,即值客户端响应,打开laravel\vendor\symfony\http-foundation\Response.php 的send方法
方法里面有个判定,fastcgi_finish_request方法是否存在来决定方法,但是fastcgi_finish_request
也就是说当php处于 fast_cgi模式运行时,响应发送给客户端后,该进程并不会马上结束,还会继续执行,所以后续会调用terminate中间件来结束生命周期
总结:
1.在生成实例时会注册项目基础服务、服务提供者别名、目录路径等注册工作,还会绑定 HTTP 内核及 Console 内核到容器内, 同时在 HTTP 内核里配置中间件和引导程序。
2.接收请求时会依据运行环境从 容器 解析出 HTTP 内核或 Console 内核, 如果是HTTP 内核还会将把中间件及引导程序注册到容器
3.请求处理时会将http实例注册到容器内,以引导程序来配置环境变量,中间件,配置文件,异常处理等服务,依据路由来执行中间件过滤请求并且执行对应的控制器方法,最后返回响应结果,结束。