Maison > développement back-end > tutoriel php > Explication détaillée du code graphique du cycle de vie du noyau PHP

Explication détaillée du code graphique du cycle de vie du noyau PHP

黄舟
Libérer: 2023-03-06 13:10:01
original
2225 Les gens l'ont consulté

Avant de comprendre le cycle de vie de PHP, comprenez d'abord comment Apache est lié à php~

1. Analyse du mécanisme de fonctionnement d'Apache


----------------------------------





Le schéma général est le suivant :




Mécanisme Apache Hook Le mécanisme Apache Hook fait référence à : Apache autorise les modules (y compris les modules internes et les modules externes, Par exemple, mod_php5.so, mod_perl.so, etc. ) Injectez des fonctions personnalisées dans la boucle de traitement des requêtes. En d'autres termes, le module peut accrocher sa propre fonction de traitement à n'importe quelle étape de traitement d'Apache, participant ainsi au processus de traitement des requêtes d'Apache.

mod_php5.so/ php5apache2.dll doit injecter les fonctions personnalisées contenues dans Apache via le mécanisme Hook et est responsable du traitement des requêtes php à chaque étape du traitement Apache. processus .

Maintenant que nous savons comment Apache s'accroche à PHP, examinons la logique du processus après les transferts d'Apache vers PHP.


2. Processus en cours d'exécution PHP Illustration

Étapes de démarrage et de fin de PHP

Après que PHP commence à l'exécuter passe par deux phases principales : la phase de début avant le traitement de la demande et la phase de fin après la demande.


2.1 SAPI exécutant PHP Plusieurs étapes passées

  1. Étape d'initialisation du module (Module init)

C'est-à-dire appeler la méthode dans PHP_MINIT_FUNCTION dans chaque code source d'extension pour initialiser le module, appliquer certaines variables requises par le module, allouer de la mémoire, etc.

  1. Phase d'initialisation de la demande (Request init)

Après avoir accepté la demande du client Appelez le méthode dans PHP_RINIT_FUNCTION de chaque extension pour initialiser l'environnement d'exécution du script PHP.

  1. Exécutez le script PHP (cette étape devrait être familière à la plupart des programmeurs PHP, et le code que vous écrivez est exécuté ici)

  2. Request Shutdown

A ce moment, la méthode PHP_RSHUTDOWN_FUNCTION de chaque extension est appelée pour nettoyer le site de requête, et ZE commence à recycler les variables et la mémoire

  1. Fermer le module (Arrêt du module)

Lorsque le serveur Web se ferme ou que le script de ligne de commande est exécuté, la méthode PHP_MSHUTDOWN_FUNCTION dans le code source de l'extension sera appelée



Après les étapes suivantes : démarrage - demande de démarrage - demande de fermeture - fin, l'implémentation de l'interface SAPI termine son cycle de vie


2.2 Phase de début

2.2. 1 Étape d'initialisation du module MINIT

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 de ligne de commande), ce processus est uniquement effectué une seule fois.

Après avoir démarré Apache, l'interpréteur PHP démarre également

PHP appelle la méthode MINIT de chaque extension (module), faisant ainsi passer ces extensions dans un état disponible.

//C'est aussi la raison pour laquelle Apache doit être redémarré lorsqu'un nouveau module dll est introduit. php.ini

PHP_MINIT_FUNCTION(myphpextension)
{
    // 注册常量或者类等初始化操作
    return SUCCESS; 
}
Copier après la connexion




2.2.2 Phase d'activation du module RINIT

Ce processus se produit dans la phase de demande Par exemple, si une page est demandée via une URL, l'activation du module (RINIT) sera. effectué avant chaque demande de démarrage).

Une fois la requête arrivée, la couche SAPI confie le contrôle à la couche PHP, et PHP initialise les variables d'environnement requises pour exécuter le script de cette requête

Par exemple, c'est RINIT du module Session. Si dans Si le module Session est activé dans php.ini, alors lors de l'appel de RINIT de ce module, la variable $_SESSION sera initialisée et le contenu pertinent sera lu alors PHP appellera la fonction RINIT ; de tous les modules, qui est une "demande d'initialisation".

在这个阶段各个模块也可以执行一些相关的操作, 模块的RINIT函数和MINIT函数类似 ,RINIT方法可以看作是一个准备过程,在程序执行之前就会自动启动。


PHP_RINIT_FUNCTION(extension_name) {
      /* Initialize session variables, pre-populate variables, redefine global variables etc */
}
Copier après la connexion




2.3结束阶段

请求处理完后就进入了结束阶段, 一般脚本执行到末尾或者通过调用exit()或者die()函数,PHP都将进入结束阶段. 和开始阶段对应,结束阶段也分为两个环节,一个在请求结束后(RSHUWDOWN),一个在SAPI生命周期结束时(MSHUTDOWN).、

2.3.1请求结束后(RSHUWDOWN)

请求处理完后就进入了结束阶段,PHP就会启动清理程序。

它会按顺序调用各个模块的RSHUTDOWN方法。

RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。

PHP_RSHUTDOWN_FUNCTION(extension_name) {
/* Do memory management, unset all variables used in the last PHP call etc */
}
Copier après la connexion




2.3.2 SAPI生命周期结束时(MSHUTDOWN)

最后,所有的请求都已处理完毕

SAPI也准备关闭了

PHP调用每个扩展的MSHUTDOWN方法

这时各个模块最后一次释放内存的机会。

(这个是对于CGI和CLI等SAPI,没有“下一个请求”,所以SAPI立刻开始关闭。)


PHP_MSHUTDOWN_FUNCTION(extension_name) {
	/* Free handlers and persistent memory etc */
}
Copier après la connexion



整个PHP生命周期就结束了。要注意的是,只有在服务器没有请求的情况下才会执行“启动第一步”和“关闭第二步”。




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:php.cn
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