Maison >cadre php >Laravel >Explication détaillée du cycle de vie de Laravel

Explication détaillée du cycle de vie de Laravel

藏色散人
藏色散人avant
2020-07-27 13:20:176683parcourir

Ce qui suit est une introduction au cycle de vie de Laravel de la colonne tutoriel Laravel J'espère que cela sera utile aux amis dans le besoin !

Explication détaillée du cycle de vie de Laravel

Le cycle de vie de Laravel

Tout dans le monde a un cycle de vie et nous devons le comprendre lorsque nous utilisons un outil Cela fonctionne, alors il sera facile à utiliser, et il en va de même pour le développement d'applications. Une fois que vous aurez compris ses principes, vous pourrez l’utiliser en toute simplicité.
Avant de comprendre le cycle de vie de Laravel, passons d'abord en revue le cycle de vie de PHP.

Cycle de vie de PHP

Mode de fonctionnement PHP

Les deux modes de fonctionnement de PHP sont le mode WEB, Mode CLI.

  1. Lorsque nous tapons la commande php dans le terminal, nous utilisons le mode CLI.
  2. Lors de l'utilisation de Nginx ou d'un autre serveur Web comme hôte pour gérer une requête entrante, le mode WEB est utilisé.

cycle de vie

Lorsque nous demandons un fichier php, PHP passera par 5 étapes de changement de cycle de vie afin de compléter la demande :

  1. Initialisation du module (MINIT), c'est-à-dire appeler la fonction d'initialisation étendue spécifiée dans php.ini pour effectuer un travail d'initialisation, tel que l'extension mysql.

  2. Demande d'initialisation (RINIT), qui consiste à initialiser la table de symboles avec les noms de variables et le contenu des valeurs de variable requis pour exécuter ce script, tels que les $_SESSION variables.

  3. Exécutez le script PHP.

  4. Demande d'arrêt), appelez les méthodes RSHUTDOWN de chaque module dans l'ordre et appelez la fonction unset pour chaque variable, telle que la variable unset $_SESSION.

  5. Module Shutdown, PHP appelle la méthode MSHUTDOWN de chaque extension C'est la dernière chance pour chaque module de libérer de la mémoire. Cela signifie qu'il n'y a pas de prochaine demande.

Le mode WEB est très similaire au mode CLI (ligne de commande), la différence est :

  1. Le mode CLI passera par 5 cycles complets dans chaque script exécution , car il n'y aura pas de prochaine requête après l'exécution de votre script ;
  2. Le mode WEB peut utiliser le multi-threading pour gérer la concurrence, donc le cycle de vie 1 et 5 ne peuvent être exécutés qu'une seule fois, et la requête suivante vient Répétez le cycle de vie de 2-4 à chaque fois, économisant ainsi la surcharge causée par l'initialisation du module système.

On constate que le cycle de vie de PHP est très symétrique. Cela dit, il s'agit de localiser où Laravel s'exécute Oui, Laravel ne s'exécute qu'à la troisième étape :

Explication détaillée du cycle de vie de Laravel

Cycle de vie PHP

Fonction

Comprenez-les, vous pouvez optimiser votre

code et avoir une compréhension plus approfondie du Laravel de Laravel (cas unique). Au moins, vous savez qu'à la fin de chaque requête, les variables de PHP seront singleton, et celles de Laravel ne seront unset que lors d'une certaine requête ; vos variables statiques dans Laravel ne peuvent pas être partagées entre plusieurs requêtes. la demande se termine par singleton. Comprendre ces concepts est la première et la plus critique étape pour écrire du code de haute qualité. N'oubliez donc pas que PHP est un langage de script et que toutes les variables ne prendront effet que dans cette requête et seront réinitialisées lors de la requête suivante, contrairement aux variables statiques Java qui ont des effets globaux. singletonunset

Le cycle de vie de Laravel

Aperçu

Le cycle de vie de Laravel commence à partir de

et se termine à partir de

. publicindex.phppublicindex.php

Explication détaillée du cycle de vie de Laravel
Processus de demande

Ce qui suit est le code source complet de

, qui peut être divisé en quatre étapes plus spécifiquement :

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);
publicindex.phpCe qui suit est une explication détaillée des quatre étapes :

Composer charge automatiquement les classes requises


    Le fichier charge les paramètres de chargement automatique générés par composer, y compris toutes vos
  1. dépendances .

    composer require

  2. Générer un conteneur, une instance d'application et enregistrer les composants principaux (HttpKernel, ConsoleKernel, ExceptionHandler) avec le conteneur (correspondant au code 2, le conteneur est très important, et sera expliqué dans détail plus tard).
  3. Traitez la requête, générez et envoyez la réponse (correspondant au code 3, il n'est pas exagéré de dire que 99% de votre code s'exécute dans cette méthode small handle).
  4. 请求结束,进行回调(对应代码4,还记得可终止中间件吗?没错,就是在这里回调的)。

Laravel 的请求步骤

Laravel 的请求步骤

我们不妨在详细一点:

第一步:注册加载composer自动生成的class loader

就是加载初始化第三方依赖。

第二步:生成容器 Container

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

第三步:这一步是重点,处理请求,并生成发送响应。

请求被发送到 HTTP 内核或 Console 内核,这取决于进入应用的请求类型。

取决于是通过浏览器请求还是通过控制台请求。这里我们主要是通过浏览器请求。

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

注意顺序:
Facades 先于ServiceProvidersFacades也是重点,后面说,这里简单提一下,注册 Facades 就是注册 config\app.php中的aliases 数组,你使用的很多类,如AuthCache,DB等等都是Facades;而ServiceProvidersregister方法永远先于boot方法执行,以免产生boot方法依赖某个实例而该实例还未注册的现象。

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

HTTP 内核的标志性方法 handle处理的逻辑相当简单:获取一个 Request,返回一个 Response,把该内核想象作一个代表整个应用的大黑盒子,输入 HTTP 请求,返回 HTTP 响应。

第四步:将请求传递给路由。

在Laravel基础的服务启动之后,就要把请求传递给路由了。路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。

传递给路由是通过 Pipeline(管道)来传递的,但是Pipeline有一堵墙,在传递给路由之前所有请求都要经过,这堵墙定义在app\Http\Kernel.php中的$middleware数组中,没错就是中间件,默认只有一个CheckForMaintenanceMode中间件,用来检测你的网站是否暂时关闭。这是一个全局中间件,所有请求都要经过,你也可以添加自己的全局中间件。

 

然后遍历所有注册的路由,找到最先符合的第一个路由,经过它的路由中间件,进入到控制器或者闭包函数,执行你的具体逻辑代码。

所以,当请求到达你写的代码之前,Laravel已经做了大量工作,请求也经过了千难万险,那些不符合或者恶意的的请求已被Laravel隔离在外。

Explication détaillée du cycle de vie de Laravel

Explication détaillée du cycle de vie de Laravel

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer