要想说明 Laravel 的生命周期需对 PHP 的生命周期进行简单说明:PHP 的运行模式分为 CGI、FAST-CGI、CLI、WEB 四种。根据目前的项目部署可简单归纳为两大类:WEB 模式、CLI 命令行模式。
PHP WEB 模式
由 Web Server(Nginx、Apache等) 负责接收用户请求并转发到 PHP-FPM 进行处理,结果返回给 Web Server 生成响应,前端渲染展示。
PHP CLI 模式
通过命令行模式执行 PHP 脚本。
PHP 生命周期
- 模块初始化(MINIT):调用
php.ini中指明的扩展的初始函数进行初始化工作,如 redis 扩展。在整个 SAPI 生命周期该过程只执行一次。- 请求初始化(RINIT):初始化本次请求所需要的变量名称和变量内容的符号表,如
$_GET变量。- 处理请求:执行 PHP 脚本。
- 请求处理完成(RSHUTDOWN):按顺序调用每个模块的
RSHUTDOWN方法,销毁变量对每个变量调用unset方法。- 关闭模块(MSHUTDOWN):PHP 调用每个扩展的
MSHUTDOWN方法。PS:Web Server 退出或者命令行脚本执行完毕退出。

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的生成的自动加载类。- 生成容器
Container,Application实例,并向容器注册核心组件(HttpKernel,ConsoleKernel,ExceptionHandler)- 处理请求并生成响应。
- 请求结束进行回调(终止中间件的回调位置)

1. 载入 Composer 生成的自动加载设置
加载初始化第三方依赖
2. 生成容器 Container
从
bootstrap/app.php脚本获取 Laravel 应用实例,并向容器注册核心组件。
3. 处理请求,生成响应
请求被发送到 HTTP 内核或 Console 内核,这取决于进入应用的请求类型。这两个内核是所有请求都要经过的中央处理器,现在,就让我们聚焦在位于
app/Http/Kernel.php的HTTP内核。Laravel 的 HTTP 内核的 Handel 处理逻辑:接收一个 Resquest,返回一个 Response。
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 令牌等等。
全局中间件,默认为
CheckForMaintenanceMode基础服务启动之后就会把请求通过
Pipeline(管道)传输给路由,但是在传递给路由前所有请求都会经过app\Http\Kernel.php中的$middleware中定义的中间件,默认的中间件只有一个CheckForMaintenanceMode用来检测网站是否维护。你也可以添加自己的中间件。遍历所有注册路由,找到最先符合的第一个路由
路由中间件
经过该路由中间件组,进入控制器或者闭包函数,执行具体的业务逻辑代码。
