Explication détaillée du cycle de vie de PHP (photo)

不言
Libérer: 2023-04-04 10:38:02
avant
4050 Les gens l'ont consulté

Cet article vous apporte une explication détaillée (image) du cycle de vie de PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

  • Le premier processus est la phase d'initialisation du module (MINIT), qui se produit pendant tout le cycle de vie de SAPI (comme tout le cycle de vie après le démarrage d'Apache ou tout le processus d'exécution du programme en ligne de commande), ce processus n'est effectué qu'une seule fois. Le deuxième processus est la phase d'activation du module (RINIT), qui se produit lors de la phase de requête. Par exemple, si une page est demandée via une URL, l'activation du module sera effectuée avant chaque requête (démarrage de la requête RINIT)

  • .
  • Une fois la requête arrivée, PHP initialise l'environnement de base pour l'exécution du script, par exemple en créant un environnement d'exécution, comprenant une table de symboles qui enregistre les noms de variables et le contenu des valeurs pendant l'exécution de PHP, ainsi qu'une table de symboles. avec toutes les fonctions, classes et autres informations actuelles. Ensuite PHP appellera la fonction RINIT de tous les modules. A ce stade, chaque module peut également effectuer certaines opérations associées

  • Généralement, le script est exécuté jusqu'au bout ou en appelant la sortie( ) ou la fonction die() , PHP entrera tous dans la phase finale. Correspondant à l'étape de début, l'étape de fin est également divisée en deux étapes. L'une consiste à désactiver le module une fois la requête terminée (RSHUTDOWN, correspondant à RINIT), et l'autre consiste à fermer le module à la fin du cycle de vie SAPI ( le serveur web se ferme ou le script de ligne de commande est exécuté et se termine). (MSHUTDOWN, correspondant à MINIT)

Cycle de vie SAPI à processus unique

  • Démarrage - Demande de démarrage - Demande de fermeture - Fin
    Explication détaillée du cycle de vie de PHP (photo)

Démarrage

Il y aura un processus d'initialisation avant d'appeler l'initialisation du module de chaque module, qui comprend :

  • Initialiser un certain nombre de variables globales

  • Initialiser un certain nombre de constantes

  • Initialiser le moteur Zend et les composants principaux

Les opérations d'initialisation ici incluent l'initialisation de la gestion de la mémoire, l'initialisation du pointeur de fonction globale (comme zend_printf mentionné précédemment, etc.), analyse lexicale et syntaxique des fichiers sources PHP, Attribuer le pointeur de fonction exécuté par le code intermédiaire, initialiser plusieurs HashTables (telles que les tables de fonctions, les tables constantes, etc.), préparer l'ini analyse de fichiers, préparation à l'analyse de fichiers sources PHP, enregistrement de fonctions intégrées (telles que strlen, definition, etc.), enregistrement de constantes standard (telles que E_ALL, TRUE, NULL, etc.), enregistrement de variables globales GLOBALS, etc.

  • Analyser php.ini

  • Initialisation de la fonction d'opération globale

  • Initialiser les modules construits statiquement et modules partagés (MINIT)

pour enregistrer ces modules dans la liste des modules enregistrés (module_registry) Si le module enregistré a déjà été enregistré, PHP signalera l'erreur Module XXX déjà chargé. 1. Enregistrez les fonctions contenues dans chaque module dans la table des fonctions (CG(function_table)). Si la fonction ne peut pas être ajoutée, Impossible d'enregistrer les fonctions, impossible de charger sera signalé.

Après les modules intégrés et les modules complémentaires, l'étape suivante consiste à enregistrer les extensions configurées de manière flexible via des objets partagés (tels que des DLL) et des fichiers php.ini.

Une fois tous les modules enregistrés, PHP effectuera immédiatement l'opération d'initialisation du module (zend_startup_modules). L'ensemble du processus consiste à parcourir chaque module tour à tour et à appeler la fonction d'initialisation de module de chaque module, ce qui est inclus dans la macro PHP_MINIT_FUNCTION mentionnée plus tôt dans cette section.

Après avoir traité le contenu lié au fichier, PHP appellera php_request_startup pour effectuer l'opération d'initialisation de la requête. L'opération d'initialisation de la requête, en plus d'appeler la fonction d'initialisation de la requête de chaque module illustré dans la figure, effectue également de nombreux autres travaux. Le contenu principal est le suivant :

  • PHP En plus de certaines des variables ci-dessus, l'environnement d'exécution dispose également d'une gestion des erreurs, d'une gestion des exceptions, etc., qui sont toutes initialisées ici. Les zend_extensions configurées via php.ini sont également parcourues et la fonction activate est appelée ici.

  • Activer SAPI

  • Initialisation de l'environnement

L'initialisation de l'environnement fait ici référence à l'initialisation de certaines variables d'environnement qui doivent être utilisées dans l'espace utilisateur. L'environnement comprend ici l'environnement du serveur, l'environnement des données de requête, etc. Les variables réelles que nous utilisons sont P OST, _GET, COOKIE, _SERVER, ENV, _FILES.

  • Initialisation de la demande de module

Exécuter

DÉSACTIVATION

Le processus de fermeture par PHP d'une requête est un ensemble de plusieurs opérations de fermeture. Cet ensemble existe dans la fonction php_request_shutdown. Cette collection comprend les éléments suivants :

Appelez toutes les fonctions enregistrées via register_shutdown_function(). Ces fonctions appelées à l'arrêt ont été ajoutées dans l'espace utilisateur. À titre d'exemple simple, nous pouvons appeler une fonction unifiée lorsqu'une erreur de script se produit pour offrir à l'utilisateur une page plus conviviale. Cela ressemble un peu à la page 404 du Web.
Exécutez toutes les fonctions __destruct disponibles. Le destructeur inclut ici le destructeur de tous les objets du pool d'objets (EG (objects_store)) et le destructeur de chaque élément dans EG (symbol_table)
Vider toutes les sorties
Envoyer l'en-tête de réponse HTTP. processus de sortie d'une chaîne, mais cette chaîne peut être conforme à certaines spécifications.
Parcourt la méthode de demande d'arrêt de chaque module et effectue l'opération d'arrêt de demande du module. C'est ce que nous voyons dans l'image. 🎜>Détruisez les variables de la table des variables globales (PG(http_globals)).
Fermez l'analyseur lexical, l'analyseur de syntaxe et l'exécuteur de code intermédiaire via la fonction post-RSHUTDOWN. Fondamentalement, chaque pointeur de fonction post_deactivate_func étendu est NULL. .
Fermez SAPI, détruisez le contenu de SG (sapi_headers), SG (request_info), etc.
Fermez le filtre de flux
Désactivez la gestion de la mémoire
Réinitialisez le temps d'exécution maximum. 🎜>

Fin

Enfin, il est temps de terminer

flush

sapi_flush vide le dernier contenu. ce qui équivaut à la fonction fflush en mode CLI. Fermez Zend Engine

zend_shutdown arrêtera le moteur Zend.

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!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal