详解Laravel的生命周期
发布时间 - 2020-07-27 00:00:00 点击率:次下面由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
# Java
# php
# composer
# mysql
# nginx
# 中间件
# bootstrap
# csrf
# require
# register
# 继承
# class
# public
# 线程
# 多线程
# 闭包
# 并发
# console
# http
# 的是
# 当我们
# 就会
# 都要
# 已被
# 并向
# 回调
# 自己的
# 组中
# 都是
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
nginx修改上传文件大小限制的方法
用v-html解决Vue.js渲染中html标签不被解析的问题
Android实现代码画虚线边框背景效果
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
JS碰撞运动实现方法详解
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
Bootstrap整体框架之JavaScript插件架构
香港服务器网站推广:SEO优化与外贸独立站搭建策略
轻松掌握MySQL函数中的last_insert_id()
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
原生JS实现图片轮播切换效果
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel如何实现用户注册和登录?(Auth脚手架指南)
linux top下的 minerd 木马清除方法
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
深圳网站制作的公司有哪些,dido官方网站?
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
Laravel Fortify是什么,和Jetstream有什么关系
三星、SK海力士获美批准:可向中国出口芯片制造设备
IOS倒计时设置UIButton标题title的抖动问题
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
HTML 中动态设置元素 name 属性的正确语法详解
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
图册素材网站设计制作软件,图册的导出方式有几种?
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Python文件异常处理策略_健壮性说明【指导】
Laravel如何实现数据库事务?(DB Facade示例)
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
如何用wdcp快速搭建高效网站?
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
,网页ppt怎么弄成自己的ppt?
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
如何在建站宝盒中设置产品搜索功能?
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
,交易猫的商品怎么发布到网站上去?
Laravel如何优化应用性能?(缓存和优化命令)
如何在IIS7上新建站点并设置安全权限?
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
如何用景安虚拟主机手机版绑定域名建站?
如何快速建站并高效导出源代码?
网站建设保证美观性,需要考虑的几点问题!
手机网站制作与建设方案,手机网站如何建设?
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
微信小程序 require机制详解及实例代码
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】

