前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Laravel 请求生命周期

Laravel 请求生命周期

作者头像
柳公子
发布2018-09-17 16:29:31
2.9K0
发布2018-09-17 16:29:31
举报
文章被收录于专栏:PhpZendoPhpZendo

当需要使用一个框架、工具或者服务时,在使用前应对其运行原理进行研究。随着原理研究工作的不断深入,能让我们在使用时更得心应手。

这篇文章旨在帮助大家掌握 「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 请求生命周期
HTTP 请求生命周期

一个 HTTP 请求实例

1

用户在浏览器输入 http://xyz.com 并点击回车按钮。

2

当用户点击回车按钮,浏览器将页面的请求通过网络发送到 Web 服务器。

3

Web 服务器接收请求并解析请求信息。在 Web 服务器的配置文件中有配置当前项目根目录路径。由于当前访问的 URL 地址不包含子路径,Web 服务器会查找配置文件的 index.php 文件。

4

Web 服务器将请求发送到项目的 public/index.php 文件。

5

PHP 解释器接收到请求后,解释执行 index.php 文件中的 PHP 代码。此时,由 Componser 包管理器生成的自动加载文件被加载。

6

之后,Laravel 应用实例被实例化,同时,引导安装 laravel 组件。

7

HTTP 或 Console 内核接收到 HTTP 请求,加载 Laravel 服务提供者,同时,将请求分发给路由器执行。

8

路由器将渲染视图文件,并生成响应数据给 Web 服务器。

9

Web 服务器接收到 PHP 的输出结果,并将结果返回给用户浏览器。

10

用户浏览器接收到服务器响应,渲染页面并展现给用户。

总结

通过理解 Laravel 请求生命周期,不仅能够增加开发 Laravel 项目的自信心。还有助于调试项目、定位和解决 bug。在某些场景下可以快加快速的更总问题。

原文:Request Life Cycle of Laravel

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年4月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 自动加载
  • 内核
  • 服务提供者
  • 分发请求
    • 路由器
    • 一个 HTTP 请求实例
      • 1
        • 2
          • 3
            • 4
              • 5
                • 6
                  • 7
                    • 8
                      • 9
                        • 10
                        • 总结
                        相关产品与服务
                        消息队列 TDMQ
                        消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档