6

我们都知道 PHP 有两种运行模式,其实不光 PHP,所有的网络编程语言都有这两种运行模式

  • 命令行界面(CLI)模式
  • WEB 服务器模式

人类社会的分工和协作从来都没有停止进化和演变,作为人类的智慧的产物同样随着人类思想的进步和创造力的提升一步步发生着变化,人们把现实中的变化,逐步映射到了计算机系统中。

PHP 是一种脚本语言,所有的变量只在一次请求中有效,下一次新的请求过来之后,所有的变量都已物是人非。所以当我们说 PHP 的生命周期的时候,通常都会加上一个限定词 “单次请求”, 全名就是PHP在单次网络请求中的生命周期 ~

image.png

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);

Laravel 的创建过程:

image.png

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 相关命令请求),还绑定了用来处理应用运行异常的调试处理器。

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中定义的路由就是由它来管理的。

$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) 看一看它是如何处理网络请求的吧,下面这张图结合第一张图会更清楚一些。

image.png

4.  结束请求,进行回调,终止 Laravel 应用,Laravel 到此也完成了它的历史使命。中间件中有一类的中间件,terminable middleware 的处理逻辑就是在这个阶段执行的。

参考文档:laravel生命周期


Bohr
6.5k 声望3.3k 粉丝