咱们都知道 PHP 有两种运行模式,其实不光 PHP,全部的网络编程语言都有这两种运行模式php
人类社会的分工和协做历来都没有中止进化和演变,做为人类的智慧的产物一样随着人类思想的进步和创造力的提高一步步发生着变化,人们把现实中的变化,逐步映射到了计算机系统中。laravel
PHP 是一种脚本语言,全部的变量只在一次请求中有效,下一次新的请求过来以后,全部的变量都已物是人非。因此当咱们说 PHP 的生命周期的时候,一般都会加上一个限定词 “单次请求”, 全名就是PHP在单次网络请求中的生命周期 ~web
1.使用Composer的自动加载功能,把全部须要使用的 PHP 文件添加到系统中以备调用 require \_\_DIR\_\_.'/../vendor/autoload.php'; 2.建立 Laravel 单例应用实例 $app \= require\_once \_\_DIR\_\_.'/../bootstrap/app.php'; 3.最关键的步骤,接受请求,对请求进行处理,返回请求处理的结果 $kernel \= $app\->make(Illuminate\\Contracts\\Http\\Kernel::class); $response \= $kernel\->handle( $request \= Illuminate\\Http\\Request::capture() ); $response\->send(); 4.请求结束,进行回调 $kernel\->terminate($request, $response);
1. 加载 Composer 生成的 autoload.php 自动加载文件
2. 建立 Laravel 应用容器对象 $app ( Service Container ) 编程
$app \= new Illuminate\\Foundation\\Application( dirname(\_\_DIR\_\_) ); $app\->singleton( Illuminate\\Contracts\\Http\\Kernel::class, App\\Http\\Kernel::class ); $app\->singleton( Illuminate\\Contracts\\Console\\Kernel::class, App\\Console\\Kernel::class ); $app\->singleton( Illuminate\\Contracts\\Debug\\ExceptionHandler::class, App\\Exceptions\\Handler::class ); return $app;
在这里基本也没啥难以理解的东西,建立了 $app 容器对象,绑定了 HTTP Kernal 和 Console Kernel,分别用来处理 HTTP 网络请求和 CLI 请求( 执行 php artisan 相关命令请求),还绑定了用来处理应用运行异常的调试处理器。bootstrap
3. 建立 Laravel HTTP Kernel 核心,接收用户的网络请求,处理并返回响应结果数组
我们终于又回来了,我们先来看看建立 Kernel 的时候都作了啥,HTTP 内核继承自 Illuminate\Foundation\Http\Kernel 类,这个类中拥有三个核心成员变量。安全
protected $app; protected $router; protected $bootstrappers \= \[ \\Illuminate\\Foundation\\Bootstrap\\LoadEnvironmentVariables::class, # 加载 .env 中的配置信息 \\Illuminate\\Foundation\\Bootstrap\\LoadConfiguration::class, # 加载 config 目录中全部配置文件的配置信息 \\Illuminate\\Foundation\\Bootstrap\\HandleExceptions::class, # 异常处理 \\Illuminate\\Foundation\\Bootstrap\\RegisterFacades::class, # 注册门面 \\Illuminate\\Foundation\\Bootstrap\\RegisterProviders::class, # 注册Service Providers \\Illuminate\\Foundation\\Bootstrap\\BootProviders::class, # 注册启动器 \];
这三个核心成员变量就是引导我们更快理清 $app->kernel->handle(网络请求) 的最好导游:服务器
$app 我们已经说了足够多,就是应用容器,咱们全部的工做都在这个容器中进行。网络
$router 路由对象,它提供路由相关的服务,帮助咱们把网络请求分配给对应的路由进行逻辑处理,而后把处理的结果(网络响应)返回给咱们,咱们在web.php中定义的路由就是由它来管理的。app
$bootstrappers 数组,这个数组中的任务项在网络请求被处理前运行,咱们能够看到环境检查,配置加载,异常处理,Facedes 门面注册,ServiceProvider 注册等等任务都须要在网络请求被处理前被首先执行,并且这些任务是有先后顺序的,排在前面的会首先执行,这也很容易理解,由于无论是 Facades 仍是 Service Providers 都是定义在 config 目录中的 app.php 文件中的,只有加载来配置以后才能注册门面和Service Providers。
而后我们再来看看 $app->kernel 的构造函数,在这里我们看到了一个脸熟的不能再熟的老朋友 — Middleware ,在 Kernel 以及它的基类 Illuminate\Foundation\Http\Kernel 中定义了一系列的 middlewares ,借助这些中间件,就能够完成对用户请求的过滤和安全检查等等功能。
public function \_\_construct(Application $app, Router $router) { $this\->app \= $app; $this\->router \= $router; $router\->middlewarePriority \= $this\->middlewarePriority; foreach ($this\->middlewareGroups as $key \=> $middleware) { $router\->middlewareGroup($key, $middleware); } foreach ($this\->routeMiddleware as $key \=> $middleware) { $router\->aliasMiddleware($key, $middleware); } }
至此我们仍是终于能够绕回来进入 $app->kernel->handle($request) 看一看它是如何处理网络请求的吧,下面这张图结合第一张图会更清楚一些。
4. 结束请求,进行回调,终止 Laravel 应用,Laravel 到此也完成了它的历史使命。中间件中有一类的中间件,terminable middleware 的处理逻辑就是在这个阶段执行的。