您好,欢迎访问一九零五行业门户网

详解Laravel的生命周期

下面由laravel教程栏目给大家介绍laravel的生命周期,希望对需要的朋友有所帮助!
laravel的生命周期
世间万物皆有生命周期,当我们使用任何工具时都需要理解它的工作原理,那么用起来就会得心应手,应用开发也是如此。理解了它的原理,那么使用起来就会游刃有余。
在了解 laravel 的生命周期前,我们先回顾一下php 的生命周期。
php 的生命周期
php 的运行模式
php两种运行模式是web模式、cli模式。
当我们在终端敲入php这个命令的时候,使用的是cli模式。当使用nginx或者别web服务器作为宿主处理一个到来的请求时,使用的是web模式。生命周期
当我们请求一个php文件时,php 为了完成这次请求,会发生5个阶段的生命周期切换:
模块初始化(minit),即调用 php.ini 中指明的扩展的初始化函数进行初始化工作,如 mysql 扩展。
请求初始化(rinit),即初始化为执行本次脚本所需要的变量名称和变量值内容的符号表,如 $_session变量。
执行该php脚本。
请求处理完成(request shutdown),按顺序调用各个模块的 rshutdown 方法,对每个变量调用 unset函数,如 unset $_session 变量。
关闭模块(module shutdown) , php调用每个扩展的 mshutdown 方法,这是各个模块最后一次释放内存的机会。这意味着没有下一个请求了。
web模式和cli(命令行)模式很相似,区别是:
cli 模式会在每次脚本执行经历完整的5个周期,因为你脚本执行完不会有下一个请求;web模式为了应对并发,可能采用多线程,因此生命周期1和5有可能只执行一次,下次请求到来时重复2-4的生命周期,这样就节省了系统模块初始化所带来的开销。可以看出php生命周期是很对称的。说了这么多,就是为了定位laravel运行在哪里,没错,laravel仅仅运行再 第三个阶段:
php生命周期
作用
理解这些,你就可以优化你的 laravel 代码,可以更加深入的了解 laravel 的singleton(单例)。至少你知道了,每一次请求结束,php 的变量都会 unset,laravel 的 singleton 只是在某一次请求过程中的singleton;你在 laravel 中的静态变量也不能在多个请求之间共享,因为每一次请求结束都会 unset。理解这些概念,是写高质量代码的第一步,也是最关键的一步。因此记住,php是一种脚本语言,所有的变量只会在这一次请求中生效,下次请求之时已被重置,而不像java静态变量拥有全局作用。
laravel 的生命周期
概述
laravel 的生命周期从public\index.php开始,从public\index.php结束。
请求过程
下面是 public\index.php的全部源码,更具体来说可以分为四步:
1. require __dir__.'/../bootstrap/autoload.php';2. $app = require_once __dir__.'/../bootstrap/app.php'; $kernel = $app->make(illuminate\contracts\http\kernel::class);3. $response = $kernel->handle( $request = illuminate\http\request::capture() ); $response->send();4. $kernel->terminate($request, $response);
以下是四步详细的解释是:
composer自动加载需要的类
文件载入composer生成的自动加载设置,包括所有你 composer require的依赖。
生成容器container,application实例,并向容器注册核心组件(httpkernel,consolekernel ,exceptionhandler)(对应代码2,容器很重要,后面详细讲解)。
处理请求,生成并发送响应(对应代码3,毫不夸张的说,你99%的代码都运行在这个小小的handle 方法里面)。
请求结束,进行回调(对应代码4,还记得可终止中间件吗?没错,就是在这里回调的)。
laravel 的请求步骤
我们不妨在详细一点:
第一步:注册加载composer自动生成的class loader就是加载初始化第三方依赖。
第二步:生成容器 container并向容器注册核心组件,是从 bootstrap/app.php 脚本获取 laravel 应用实例,
第三步:这一步是重点,处理请求,并生成发送响应。请求被发送到 http 内核或 console 内核,这取决于进入应用的请求类型。
取决于是通过浏览器请求还是通过控制台请求。这里我们主要是通过浏览器请求。
http 内核继承自 illuminate\foundation\http\kernel 类,该类定义了一个 bootstrappers 数组,这个数组中的类在请求被执行前运行,这些 bootstrappers 配置了错误处理、日志、检测应用环境以及其它在请求被处理前需要执行的任务。
protected $bootstrappers = [ //注册系统环境配置 (.env) 'illuminate\foundation\bootstrap\detectenvironment', //注册系统配置(config) 'illuminate\foundation\bootstrap\loadconfiguration', //注册日志配置 'illuminate\foundation\bootstrap\configurelogging', //注册异常处理 'illuminate\foundation\bootstrap\handleexceptions', //注册服务容器的门面,facade 是个提供从容器访问对象的类。 'illuminate\foundation\bootstrap\registerfacades', //注册服务提供者 'illuminate\foundation\bootstrap\registerproviders', //注册服务提供者 `boot` 'illuminate\foundation\bootstrap\bootproviders', ];
注意顺序:
facades 先于serviceproviders,facades也是重点,后面说,这里简单提一下,注册 facades 就是注册 config\app.php中的aliases 数组,你使用的很多类,如auth,cache,db等等都是facades;而serviceproviders的register方法永远先于boot方法执行,以免产生boot方法依赖某个实例而该实例还未注册的现象。
http 内核还定义了一系列所有请求在处理前需要经过的 http 中间件,这些中间件处理 http 会话的读写、判断应用是否处于维护模式、验证 csrf 令牌等等。
http 内核的标志性方法 handle处理的逻辑相当简单:获取一个 request,返回一个 response,把该内核想象作一个代表整个应用的大黑盒子,输入 http 请求,返回 http 响应。
第四步:将请求传递给路由。在laravel基础的服务启动之后,就要把请求传递给路由了。路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。
传递给路由是通过 pipeline(管道)来传递的,但是pipeline有一堵墙,在传递给路由之前所有请求都要经过,这堵墙定义在app\http\kernel.php中的$middleware数组中,没错就是中间件,默认只有一个checkformaintenancemode中间件,用来检测你的网站是否暂时关闭。这是一个全局中间件,所有请求都要经过,你也可以添加自己的全局中间件。
然后遍历所有注册的路由,找到最先符合的第一个路由,经过它的路由中间件,进入到控制器或者闭包函数,执行你的具体逻辑代码。
所以,当请求到达你写的代码之前,laravel已经做了大量工作,请求也经过了千难万险,那些不符合或者恶意的的请求已被laravel隔离在外。
处理请求到响应过程
以上就是详解laravel的生命周期的详细内容。
其它类似信息

推荐信息