摘要:应用实例所依赖的服务提供者可以在配置文件中的节点找到。完成所有服务提供者注册到应用实例后,应用实例执行启动方法引导项目启动。或内核接收到请求,加载服务提供者,同时,将请求分发给路由器执行。
这是一篇翻译文章,原文 Request Life Cycle of Laravel,译文 Laravel 请求生命周期 首发于个人博客,转载请注明出处。
当需要使用一个框架、工具或者服务时,在使用前应对其运行原理进行研究。随着原理研究工作的不断深入,能让我们在使用时更得心应手。
这篇文章旨在帮助大家掌握 「Laravel HTTP 请求生命周期」 的工作原理。内容涵盖当一个 HTTP 请求发送到 Laravel 服务后,这个请求在项目运行的各个阶段是如何被处理的,然后框架又是如何将处理结果发送回用户的。
我们会带领大家一步步深入挖掘出这其中的秘密。
自动加载第一步,当用户在浏览器访问 URL 时会发起一个 HTTP 请求,最终这个请求被发送到我们的 Web 服务器。Web 服务器(Apache 或 Nginx) 通过匹配的服务配置,再将请求发送到 Laravel 中的 入口文件 public/index.php,该文件完成项目依赖服务的加载功能。首先它将 composer 生成的自动加载器引入项目(译注:require __DIR__."/../vendor/autoload.php";)。
然后接收由 bootstrap/app.php 文件创建的应用实例。创建实例的过程即是项目初始化的过程。
内核下一步:我们将焦点锁定到应用实例的内核部分。
应用实例根据 HTTP 请求的运行环境,来决定将请求发送到 HTTP 内核或 Console 内核。这两个内核是所有 HTTP 请求的集散中心。
HTTP 内核是定义在 app/Http/Kernel.php 文件内的 Kernel 实现类,它接收一个请求,然后返回一个响应,就是这么简单。不过,在 Kernel 类的内部有定义诸多的 引导程序(Bootstrappers),这些引导程序会完成错误句柄(handle)配置、日志配置、运行环境识别和所有需要在请求被执行前完成的配置工作。
不仅如此,Kernel 类还定义了许多需要在请求被处理前需要被执行的中间件。
服务提供者接下来,内核会在引导项目启动时加载服务提供者。应用实例所依赖的服务提供者可以在 config/app.php 配置文件中的 providers 节点找到。
一个服务提供者的 register() 方法被调用时,这个服务提供者即被注册到应用实例。完成所有服务提供者注册到应用实例后,应用实例执行启动方法(boot method)引导项目启动。
分发请求随着应用实例完成引导、注册服务器提供者和启动等处理,接下来请求便会被路由器(Router)转发。路由器将请求转发至注册的路由和对应的控制器(译注:在 routes/web.php 或 routes/api.php 文件中定义的路由),并且执行当前路由相关的中间件。
路由器现在到了请求被处理和渲染的环节:
Router will direct the HTTP Request to a Controller or return a view or responses directly by omitting the controller. These routes will be placed in app/routes.php.
路由器把 HTTP 请求发送到匹配的控制器或视图。我们可以在 routes/web.php 中(译注:原文定义在 app/routes.php 中,仅适用于 Laravel 5.3 之前)定义路由。
项目所有的控制器都管理在 app/Https/Controllers(译注:原文 app/controllers) 目录中,一个控制器对应一个操作,并发送数据到其视图。
视图文件被定义在 resources/views 目录中,功能是输出数据并响应 HTTP 请求。
下面的执行流程图详细描述了上述步骤的执行过程:
一个 HTTP 请求实例 1用户在浏览器输入 http://xyz.com 并点击回车按钮。
2当用户点击回车按钮,浏览器将页面的请求通过网络发送到 Web 服务器。
3Web 服务器接收请求并解析请求信息。在 Web 服务器的配置文件中有配置当前项目根目录路径。由于当前访问的 URL 地址不包含子路径,Web 服务器会查找配置文件的 index.php 文件。
4Web 服务器将请求发送到项目的 public/index.php 文件。
5PHP 解释器接收到请求后,解释执行 index.php 文件中的 PHP 代码。此时,由 Componser 包管理器生成的自动加载文件被加载。
6之后,Laravel 应用实例被实例化,同时,引导安装 laravel 组件。
7HTTP 或 Console 内核接收到 HTTP 请求,加载 Laravel 服务提供者,同时,将请求分发给路由器执行。
8路由器将渲染视图文件,并生成响应数据给 Web 服务器。
9Web 服务器接收到 PHP 的输出结果,并将结果返回给用户浏览器。
10用户浏览器接收到服务器响应,渲染页面并展现给用户。
总结通过理解 Laravel 请求生命周期,不仅能够增加开发 Laravel 项目的自信心。还有助于调试项目、定位和解决 bug。在某些场景下可以快加快速的更总问题。
原文:Request Life Cycle of Laravel
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/30718.html
摘要:引导程序包括完成环境检测配置加载异常处理注册服务提供者注册启动服务这六个引导程序。处理请求请求处理发生在内核的方法内。发送响应头部信息发送报文主题终止程序程序终止,完成终止中间件的调用终止中间件以上便是的请求生命周期的始末。 本文首发于个人博客 深度挖掘 Laravel 生命周期,转载请注明出处。 这篇文章我们来聊聊 「Laravel 生命周期」 这个主题。虽然网络上已经有很多关于这个...
摘要:请求处理阶段请求处理阶段首先是准备请求处理的环境,包括环境加载服务提供者注册等环节,然后将请求实例通过中间件处理及通过路由和控制器的分发控制,使得不同的请求通过相应的处理程序进行处理并生成响应的过程。 Laravel请求到响应的整个执行过程,主要可以归纳为四个阶段,即程序启动准备阶段、请求实例化阶段、请求处理阶段、响应发送和程序终止阶段。 程序启动准备阶段 服务容器实例化 服务容器的实...
摘要:因为为单个请求创建的环境将在请求过程完成后立即销毁。可以成为强大的性能增强器,提供了优雅的结构和代码使用方式。你可以使用此命令快速安装它,并访问官方网站获取更多信息。注意目前仅支持和。服务器不能使用。基准测试使用进行干净的测试。 Swoole 是针对PHP的生产级异步编程框架。它是一种用纯C语言编写的PHP扩展,它使PHP开发人员能够在PHP中编写高性能,可扩展的并发TCP,UDP,U...
摘要:是为开发的生产级异步编程框架。因为单个请求创建的环境在请求执行结束后会立即销毁。可以提供强大性能而则可以提供优雅代码结构使用。在使用这个包之前,请确保你的机器安装了正确的。建立并运行起来现在,你可以执行以下的命令来启动服务。 showImg(https://segmentfault.com/img/bVbaF89?w=1240&h=634); Swoole 是为 PHP 开发的生产级异...
摘要:负责解释执行文件生成响应,最终返回给,展现至前端。相比于传统架构,进程模型最大的特点在于其多线程模式处理网络请求,使得其能轻松应对大量连接。这要求开发人员对于多进程的运行模式有更清晰的认识更容易内存泄露。 一、SwooleSwoole号称重新定义了PHP,它是一个PHP扩展,使得PHP可以使用异步的方式执行,就像node一样,而且还能使用socket,为PHP提供了一系列异步IO、事件...
阅读 3202·2021-11-24 09:39
阅读 2870·2021-09-09 11:34
阅读 3169·2021-09-07 09:58
阅读 2275·2019-08-30 13:07
阅读 2827·2019-08-29 15:09
阅读 1542·2019-08-29 13:01
阅读 2282·2019-08-26 12:18
阅读 1864·2019-08-26 10:28