Laravel 工作的原因:完整的请求生命周期
简介:如果我们使用任何一个工具,如果我们了解它的内部原理,那么它会非常好用,我们不会再为一些小错误寻找原因,工作也会顺利进行。保持顺利。冷静点。
本文解释了 Laravel 为何有效。分析完之后,一切就不再那么神秘了,我们将更有信心构建您的应用程序。
Laravel 是一个简单的 PHP Web 开发框架(PHP Web Framework)。今天我们来学习一下Laravel的生命周期。在此之前,我们先回顾一下PHP的生命周期。
PHP 生命周期
生命周期
当我们请求 php 文件时,PHP 会经历 5 个生命周期转换来完成请求:
- 模块初始化 (MINT) php.ini 文件中指定的扩展初始化函数初始化要执行的工作,例如 mysql 扩展。
- 请求初始化(RINIT),初始化执行脚本所需的变量名和变量值的符号表,例如$_SESSION变量。
- 运行 PHP 脚本。
- 请求处理完成(Request Shutdown)后,依次调用各个模块的RSHUTDOWN方法,并对各个变量调用unset函数,例如unset $_SESSION变量。
- 关闭一个模块,PHP调用各个插件的MSHUTDOWN方法。这是所有模块释放内存的最后机会。这意味着没有下一个请求。
PHP模式
PHP有两种模式:WEB模式和CLI模式。- 当我们在终端输入php命令时,我们使用的是CLI模式。
- 如果使用 Nginx 或其他 Web 服务器作为主机来处理传入请求,则使用 WEB 模式。
- WEB模式可以使用多线程来应对并发,因此生命周期1和5只能执行一次,在下一次请求时重复执行。 2-4个生命周期,从而节省了初始化系统模块带来的额外成本。
- CLI 模式每次执行脚本都会经历整整 5 个周期,因为脚本执行完后就不会再有下一个请求。

理解这些,你可以优化你的 Laravel 代码并更深入地了解 Laravel 的单例(仅示例)。至少你知道,每次请求之后,PHP 变量都会失效。 Laravel 仅在特定请求期间进行单选; Laravel 中的静态变量不能在多个请求之间共享,因为每个请求最终都会失效。理解这些概念是编写高质量代码的第一步,也是最关键的一步。因此请记住,PHP 是一种脚本语言,任何变量只会在本次请求中有效,并在下一次请求时重置,这与具有全局作用的 Java 静态变量不同。
Laravel 的生命周期
Laravel 的生命周期从 public\index.php 文件开始,到 public\index.php 文件结束。
下面是这四个步骤的详细解释: Composer 会自动加载必要的类// 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 生成的自动加载设置,包括所有您的作曲家所需的依赖项。
- 生成一个容器容器,一个应用实例,并在容器中注册核心组件(HttpKernel、ConsoleKernel、ExceptionHandler)(根据代码2,容器非常重要,后面会详细讲解)。
- 处理请求,生成并发送响应(根据代码3,不夸张地说,99%的代码都在这个小handler方法中运行)。
- 请求结束,发生回调(根据代码4,还记得中间件可以停止吗?是的,这里有回调)。

Laravel请求步骤,我们还可以详细说明:
第一步:注册并加载composer自动生成的类加载器
加载并初始化第三方依赖。2。步骤1:创建容器容器
,并在容器中注册核心组件,这意味着从bootstrap/app.php脚本中获取Laravel应用程序实例。这一步是重点,处理请求并生成响应发送。
请求将发送到 HTTP 或控制台核心,具体取决于应用程序收到的请求类型。取决于请求是通过浏览器还是控制台发出。在这里,我们主要通过浏览器进行请求。 HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类,该类定义了引导程序数组。该数组中的类在请求执行之前执行。这些引导程序配置错误处理、日志记录、检测应用程序环境以及处理请求之前必须执行的其他任务。注意顺序:门面在服务提供商之前,门面也很重要。后面会提到,这里简单提一下。注册 Facades 意味着在 config\app.php 文件中注册别名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',
];
数组。使用的很多类,如 Auth、Cache、DB 等,都是门面;并且ServiceProviders的register方法总是在startup方法之前运行,避免startup方法依赖于实例而实例未注册的现象。 HTTP核心还定义了一组HTTP中间件,所有请求在被处理之前都必须经过它们。这些中间件处理读取和写入 HTTP 会话、确定应用程序是否处于维护模式、验证 CSRF 令牌等。返回响应,将内核视为代表整个应用程序的大黑匣子,发出 HTTP 请求并返回 HTTP 响应。
4。步骤:将请求传递给路由器
启动Laravel基础服务后,必须将请求传递给路由器。路由器将请求发送到路由或控制器,同时运行路由定义的所有中间件。 路由经过管道,但是管道有一面墙,所有请求都必须经过它才能到达路由。这堵墙定义在 app\Http\Kernel.php 的 $middleware 数组中。是的,这就是中间件。默认情况下,只有一个 CheckForMaintenanceMode 中间件来检测网站是否暂时关闭。它是一个所有请求都要经过的全局中间件。您还可以添加自己的全局中间件。 然后进入所有注册的路由,找到第一个对应的路由,通过你的路由中间件,进入控制或者关闭函数,执行对应的逻辑代码。所以在请求到达你写的代码之前,Laravel 就已经做了很多工作,请求也经历了很多麻烦。 Laravel 会隔离不适当或恶意的请求。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。