Maison  >  Article  >  développement back-end  >  Analyse du cycle de vie PHP

Analyse du cycle de vie PHP

墨辰丷
墨辰丷original
2018-05-15 15:09:433700parcourir

Cet article présente principalement le cycle de vie de PHP. Avant de comprendre le cycle de vie de PHP, vous devez comprendre comment Apache est lié à PHP. J'espère que cela vous sera utile. toi.

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, tels que mod_php5.so, mod_perl.so, etc. ) injectent 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 après le démarrage d'Apache Pendant tout le cycle de vie ou tout le processus d'exécution du programme en ligne de commande), ce processus n'est effectué qu'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; 
}





2.2.2 Phase d'activation du module RINIT


该过程发生在请求阶段, 例如通过url请求某个页面,则在每次请求之前都会进行模块激活(RINIT请求开始)。 

请求到达之后,SAPI层将控制权交给PHP层,PHP初始化本次请求执行脚本所需的环境变量

例如是Session模块的RINIT,如果在php.ini中启用了Session 模块,那在调用该模块的RINIT时就会初始化$_SESSION变量,并将相关内容读入; 然后PHP会调用所有模块RINIT函数,即“请求初始化”。 

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



PHP_RINIT_FUNCTION(extension_name) {
      /* Initialize session variables, pre-populate variables, redefine global variables etc */
}






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 */
}





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


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

SAPI也准备关闭了 

PHP调用每个扩展的MSHUTDOWN方法 

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

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



PHP_MSHUTDOWN_FUNCTION(extension_name) {
	/* Free handlers and persistent memory etc */
}



Le cycle de vie complet de PHP est terminé. A noter que « démarrer la première étape » et « fermer la deuxième étape » ne seront exécutés que lorsqu'il n'y a pas de requête du serveur.

Recommandations associées :

Analyse du cycle de vie des demandes d'application du framework thinkPHP5.0

Comment utiliser le cycle de vie des composants Vue


Réagir Quelle est la durée du cycle de vie des composants natifs


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:
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