浅谈 Laravel 框架的生命周期

787 阅读2分钟

要想说明 Laravel 的生命周期需对 PHP 的生命周期进行简单说明:PHP 的运行模式分为 CGI、FAST-CGI、CLI、WEB 四种。根据目前的项目部署可简单归纳为两大类:WEB 模式、CLI 命令行模式。

PHP WEB 模式

由 Web Server(Nginx、Apache等) 负责接收用户请求并转发到 PHP-FPM 进行处理,结果返回给 Web Server 生成响应,前端渲染展示。

PHP CLI 模式

通过命令行模式执行 PHP 脚本。

PHP 生命周期

  1. 模块初始化(MINIT):调用 php.ini 中指明的扩展的初始函数进行初始化工作,如 redis 扩展。在整个 SAPI 生命周期该过程只执行一次。
  2. 请求初始化(RINIT):初始化本次请求所需要的变量名称和变量内容的符号表,如 $_GET 变量。
  3. 处理请求:执行 PHP 脚本。
  4. 请求处理完成(RSHUTDOWN):按顺序调用每个模块的 RSHUTDOWN 方法,销毁变量对每个变量调用 unset 方法。
  5. 关闭模块(MSHUTDOWN):PHP 调用每个扩展的 MSHUTDOWN 方法。PS:Web Server 退出或者命令行脚本执行完毕退出。

img

Laravel 生命周期

Laravel 的生命周期是从 public\index.php 开始,从 public\index.php 结束。

img

以下为 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);
  1. 载入 composer 的生成的自动加载类。
  2. 生成容器 ContainerApplication 实例,并向容器注册核心组件(HttpKernelConsoleKernelExceptionHandler
  3. 处理请求并生成响应。
  4. 请求结束进行回调(终止中间件的回调位置)

cdn.sinaimg.cn.52ecy-20200305161625775.cn

1. 载入 Composer 生成的自动加载设置

加载初始化第三方依赖

2. 生成容器 Container

bootstrap/app.php 脚本获取 Laravel 应用实例,并向容器注册核心组件。

3. 处理请求,生成响应

请求被发送到 HTTP 内核或 Console 内核,这取决于进入应用的请求类型。这两个内核是所有请求都要经过的中央处理器,现在,就让我们聚焦在位于app/Http/Kernel.php 的HTTP内核。

Laravel 的 HTTP 内核的 Handel 处理逻辑:接收一个 Resquest,返回一个 Response。

  1. Bootstrap 检测环境,加载 bootstrapper 数组中的一些配置

    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',
        ];
    

    HTTP 内核还定义了一系列所有请求在处理前需要经过的 HTTP 中间件,这些中间件处理 HTTP 会话 的读写、判断应用是否处于维护模式、验证 CSRF 令牌等等。

  2. 全局中间件,默认为 CheckForMaintenanceMode

    基础服务启动之后就会把请求通过 Pipeline (管道)传输给路由,但是在传递给路由前所有请求都会经过 app\Http\Kernel.php 中的 $middleware 中定义的中间件,默认的中间件只有一个 CheckForMaintenanceMode 用来检测网站是否维护。你也可以添加自己的中间件。

  3. 遍历所有注册路由,找到最先符合的第一个路由

  4. 路由中间件

    经过该路由中间件组,进入控制器或者闭包函数,执行具体的业务逻辑代码。

img