详解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的生命周期的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Laravel9和CodeIgniter4的最新版本提供了更新的特性和改进。Laravel9采用MVC架构,提供数据库迁移、身份验证和模板引擎等功能。CodeIgniter4采用HMVC架构,提供路由、ORM和缓存。在性能方面,Laravel9的基于服务提供者设计模式和CodeIgniter4的轻量级框架使其具有出色的性能。在实际应用中,Laravel9适用于需要灵活性和强大功能的复杂项目,而CodeIgniter4适用于快速开发和小型应用程序。

比较Laravel和CodeIgniter的数据处理能力:ORM:Laravel使用EloquentORM,提供类对象关系映射,而CodeIgniter使用ActiveRecord,将数据库模型表示为PHP类的子类。查询构建器:Laravel具有灵活的链式查询API,而CodeIgniter的查询构建器更简单,基于数组。数据验证:Laravel提供了一个Validator类,支持自定义验证规则,而CodeIgniter的验证功能内置较少,需要手动编码自定义规则。实战案例:用户注册示例展示了Lar

对于初学者来说,CodeIgniter的学习曲线更平缓,功能较少,但涵盖了基本需求。Laravel提供了更广泛的功能集,但学习曲线稍陡。在性能方面,Laravel和CodeIgniter都表现出色。Laravel具有更广泛的文档和活跃的社区支持,而CodeIgniter更简单、轻量级,具有强大的安全功能。在建立博客应用程序的实战案例中,Laravel的EloquentORM简化了数据操作,而CodeIgniter需要更多的手动配置。

Laravel - Artisan 命令 - Laravel 5.7 提供了处理和测试新命令的新方法。它包括测试 artisan 命令的新功能,下面提到了演示?

在选择大型项目框架时,Laravel和CodeIgniter各有优势。Laravel针对企业级应用程序而设计,提供模块化设计、依赖项注入和强大的功能集。CodeIgniter是一款轻量级框架,更适合小型到中型项目,强调速度和易用性。对于具有复杂需求和大量用户的大型项目,Laravel的强大功能和可扩展性更合适。而对于简单项目或资源有限的情况下,CodeIgniter的轻量级和快速开发能力则更为理想。

微服务架构使用PHP框架(如Symfony和Laravel)来实现微服务,并遵循RESTful原则和标准数据格式来设计API。微服务通过消息队列、HTTP请求或gRPC进行通信,并使用工具(如Prometheus和ELKStack)进行监控和故障排除。

对于小型项目,Laravel适用于大型项目,需要强大的功能和安全性。CodeIgniter适用于非常小的项目,需要轻量级和易用性。

比较了Laravel的Blade和CodeIgniter的Twig模板引擎,根据项目需求和个人偏好进行选择:Blade基于MVC语法,鼓励良好代码组织和模板继承。Twig是第三方库,提供灵活语法、强大过滤器、扩展支持和安全沙箱。
