La colonne tutorielle suivante de Laravel vous donnera une compréhension préliminaire du cycle de vie dans Laravel. J'espère qu'elle sera utile aux amis qui en ont besoin !
Les deux modes de fonctionnement de PHP sont le mode WEB et le mode CLI.
Lorsque nous tapons la commande php dans le terminal, nous utilisons le mode CLI.
Lorsque vous utilisez Nginx ou un autre serveur Web comme hôte pour gérer une requête entrante, le mode WEB est utilisé.
Lorsque nous demandons un fichier php, PHP passera par 5 étapes de changement de cycle de vie afin de compléter cette demande :
Initialisation du module (MINIT), c'est-à-dire appeler php.ini comme spécifié La fonction d'initialisation étendue effectue un travail d'initialisation, tel que l'extension mysql.
Initialisation de la demande (RINIT), qui consiste à initialiser la table de symboles des noms de variables et du contenu des valeurs de variable requis pour exécuter ce script, comme la variable $_SESSION.
Exécutez le script PHP.
Une fois le traitement de la demande terminé (Request Shutdown), appelez la méthode RSHUTDOWN de chaque module dans l'ordre et appelez la fonction unset pour chaque variable, telle que la variable unset $_SESSION.
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 :
Le mode CLI effectuera 5 cycles complets à chaque fois que le script est exécuté, car il n'y aura pas de prochaine requête après l'exécution de votre script ; Afin de gérer la concurrence, le mode WEB peut utiliser le multithreading, de sorte que les cycles de vie 1 et 5 ne peuvent être exécutés qu'une seule fois, et les cycles de vie 2 à 4 seront répétés lors de la prochaine requête, économisant ainsi la surcharge causée par le système. initialisation des modules. On constate que le cycle de vie de PHP est très symétrique. Cela dit, il s'agit simplement de localiser où Laravel s'exécute Oui, Laravel ne s'exécute que dans la troisième étape :
Comprenez-les, vous pouvez optimiser votre code Laravel et approfondir Comprendre le singleton de Laravel. (cas unique). Au moins, vous savez qu'à la fin de chaque requête, les variables PHP seront désactivées. Le singleton de Laravel n'est qu'un singleton lors d'une certaine requête ; vos variables statiques dans Laravel ne peuvent pas être partagées entre plusieurs requêtes, car chaque requête sera désactivée à la fin de chaque requête. fin. 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.
Le cycle de vie de Laravel commence à partir de publicindex.php et se termine à partir de publicindex.php.
Ce qui suit est le code source complet de publicindex.php Plus précisément, il peut être divisé en quatre étapes :
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);
Ce 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 les dépendances requises par votre composer.
Générez un conteneur, une instance d'application et enregistrez les composants principaux (HttpKernel, ConsoleKernel, ExceptionHandler) avec le conteneur (correspondant au code 2, le conteneur est très important et sera expliqué en détail plus tard).
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).
La requête se termine et un rappel est effectué (correspondant au code 4, vous vous souvenez du middleware terminé ? Oui, il est rappelé ici).
Autant entrer plus en détail :
Étape 1 : Enregistrez et chargez le chargeur de classe généré automatiquement par composer Il s'agit de charger et d'initialiser les dépendances tierces.
Étape 2 : Générer un conteneur Container Et l'enregistrement des composants principaux auprès du conteneur consiste à obtenir l'instance d'application Laravel à partir du script bootstrap/app.php
Étape 3 : Cette étape est au centre du traitement de la demande et de la génération d'une réponse. Les requêtes sont envoyées au cœur HTTP ou au cœur de la console, selon le type de requête entrant dans l'application.
Cela dépend si cela est demandé via le navigateur ou la console. Ici, nous demandons principalement via le navigateur. La logique du traitement des handles, la méthode emblématique du noyau HTTP, est assez simple : obtenir une requête, renvoyer une réponse, imaginer le noyau comme une grande boîte noire représentant l'ensemble de l'application, saisir une requête HTTP et renvoyer une réponse HTTP.
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 先于ServiceProviders,Facades也是重点,后面说,这里简单提一下,注册 Facades 就是注册 config\app.php中的aliases 数组,你使用的很多类,如Auth,Cache,DB等等都是Facades;而ServiceProviders的register方法永远先于boot方法执行,以免产生boot方法依赖某个实例而该实例还未注册的现象。HTTP 内核还定义了一系列所有请求在处理前需要经过的 HTTP 中间件,这些中间件处理 HTTP 会话的读写、判断应用是否处于维护模式、验证 CSRF 令牌等等。
在Laravel基础的服务启动之后,就要把请求传递给路由了。路由器将会分发请求到路由或控制器,同时运行所有路由指定的中间件。
传递方式: 传递给路由是通过 Pipeline(管道)来传递的,但是Pipeline有一堵墙,在传递给路由之前所有请求都要经过,这堵墙定义在app\Http\Kernel.php中的$middleware数组中,没错就是中间件,默认只有一个CheckForMaintenanceMode中间件,用来检测你的网站是否暂时关闭。这是一个全局中间件,所有请求都要经过,你也可以添加自己的全局中间件。
然后遍历所有注册的路由,找到最先符合的第一个路由,
经过该路由中间件,进入到控制器或者闭包函数,执行你的具体逻辑代码。
所以,当请求到达你写的代码之前,Laravel已经做了大量工作,请求也经过了千难万险,那些不符合或者恶意的的请求已被Laravel隔离在外。
原文地址:https://juejin.cn/post/6992208648575385607
作者:卡二条
相关推荐:最新的五个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!