Maison >développement back-end >tutoriel php >Explication détaillée des principes et processus d'exécution PHP
Le contenu de cet article concerne une explication détaillée des principes d'exécution et des processus de PHP. Il a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer
• Nous n'avons jamais démarré manuellement le processus lié à PHP, il s'exécute au démarrage d'Apache
• ; PHP passe mod_php5. Le module so est connecté à Apache (en particulier, SAPI, Server Application Programming Interface) ;
• PHP a un total de trois modules : le noyau, le moteur Zend et la couche d'extension
• Le noyau PHP est ; utilisé pour traiter les requêtes, le streaming de fichiers, la gestion des erreurs et d'autres opérations connexes ;
• Le moteur Zend (ZE) est utilisé pour convertir les fichiers sources en langage machine, puis l'exécuter sur une machine virtuelle
• La couche d'extension est ; un ensemble de fonctions, de bibliothèques de classes et de Streams, PHP les utilise pour effectuer certaines opérations spécifiques. Par exemple, nous avons besoin de l'extension mysql pour nous connecter à la base de données MySQL ;
• Lorsque ZE exécute le programme, il peut avoir besoin de se connecter à plusieurs extensions. À ce moment, ZE passe le contrôle à l'extension et le rend ensuite. traiter la tâche spécifique ;
• Enfin, ZE renvoie les résultats de l'exécution du programme au noyau PHP, qui transmet ensuite les résultats à la couche SAPI et les envoie enfin au navigateur.
Explorer en profondeur
Attendez, ce n'est pas si simple. Le processus ci-dessus n’est qu’une version simplifiée, creusons un peu plus pour voir ce qui se passe d’autre dans les coulisses.
• Après le démarrage d'Apache, l'interpréteur PHP démarre également ;
• Il y a deux étapes dans le processus de démarrage de PHP
• La première étape consiste à initialiser certaines variables d'environnement, qui se produiront tout au long de la vie de SAPI ; cycle Function;
• La deuxième étape consiste à générer des paramètres de variables uniquement pour la requête en cours.
• Après avoir démarré Apache, l'interpréteur PHP démarre également
• PHP appelle la méthode MINIT de chaque extension pour faire passer ces extensions dans un état disponible. Jetez un œil aux extensions ouvertes dans le fichier php.ini
• MINIT signifie "initialisation du module". Chaque module définit un ensemble de fonctions, de bibliothèques de classes, etc. pour gérer d'autres requêtes.
Une méthode MINIT typique est la suivante :
PHP_MINIT_FUNCTION(extension_name){ /* Initialize functions, classes etc */ }
• PHP appelle la méthode RINIT de chaque module, qui est la "requête d'initialisation". Un exemple classique est le RINIT du module Session. Si le module Session est activé dans php.ini, la variable $_SESSION sera initialisée lorsque le RINIT du module sera appelé, et le contenu pertinent sera lu
; • La méthode RINIT peut être considérée comme un processus de préparation, elle démarrera automatiquement entre les exécutions du programme.
Une méthode RINIT typique est la suivante :
PHP_RINIT_FUNCTION(extension_name) { /* Initialize session variables, pre-populate variables, redefine global variables etc */ }
如同PHP启动一样,PHP的关闭也分两步:
• 一旦页面执行完毕(无论是执行到了文件末尾还是用exit或die函数中止),PHP就会启动清理程序。它会按顺序调用各个模块的RSHUTDOWN方法。
• RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。
一个典型的RSHUTDOWN方法如下:
PHP_RSHUTDOWN_FUNCTION(extension_name) { /* Do memory management, unset all variables used in the last PHP call etc */ }
1
2
3
最后,所有的请求都已处理完毕,SAPI也准备关闭了,PHP开始执行第二步:
• PHP调用每个扩展的MSHUTDOWN方法,这是各个模块最后一次释放内存的机会。
一个典型的RSHUTDOWN方法如下:
PHP_MSHUTDOWN_FUNCTION(extension_name) { /* Free handlers and persistent memory etc */ }
1
2
3
这样,整个PHP生命周期就结束了。要注意的是,只有在服务器没有请求的情况下才会执行“启动第一步”和“关闭第二步”。
下面的是用一些图示来说明的!
从图上可以看出,php从下到上是一个4层体系
①Zend引擎
Zend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕zend实现。
②Extensions
围绕着zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的php中间层、富文本解析就是extension的典型应用)。
③Sapi
Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过sapi成功的将php本身和上层应用解耦隔离,php可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。后面将在sapi章节中介绍
④上层应用
这就是我们平时编写的php程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等。
Le modèle moteur (Zend) + composant (ext) réduit le couplage interne
La couche intermédiaire (sapi) isole le serveur web et PHP
** *********************************************** *** ************
Si php est une voiture, alors
Le framework de la voiture est php lui-même
Zend est le moteur ( moteur) de la voiture
Les différents composants sous Ext sont les roues de la voiture
Sapi peut être considéré comme une route, et la voiture peut rouler sur différents types de routes
Et l'exécution d'un programme php est-ce que la voiture roule sur la route.
Par conséquent, nous avons besoin de : un moteur d'excellentes performances + des roues adaptées + une piste correcte
L'analyse de php par Apache se fait via php dans de nombreux modules Module à compléter.
Pour enfin intégrer php dans le système Apache, vous devez effectuer certains réglages nécessaires pour Apache. Ici, nous prendrons le mode de fonctionnement mod_php5 SAPI de php comme exemple pour expliquer Quant au concept de SAPI, nous l'expliquerons en détail plus tard.
En supposant que les versions que nous avons installées sont Apache2 et Php5, nous devons alors éditer le fichier de configuration principal d'Apache http.conf et y ajouter les lignes suivantes :
Dans l'environnement Unix/Linux :
LoadModule php5_module modules/ mod_php5.so
AddType application/x-httpd-php .php
Remarque : modules/mod_php5.so est l'emplacement d'installation du fichier mod_php5.so dans l'environnement système X.
Dans l'environnement Windows :
LoadModule php5_module d:/php/php5apache2.dll
AddType application/x-httpd-php .php
Remarque : d:/php/php5apache2.dll est dans Windows. emplacement d'installation du fichier php5apache2.dll dans l'environnement.
Ces deux configurations indiquent au serveur Apache que toute demande d'utilisateur d'URL reçue à l'avenir avec php comme suffixe devra appeler le module php5_module (mod_php5.so/php5apache2.dll) pour être traitée.
Que font les 11 étapes du cycle de traitement des requêtes Apache ?
1. Étape post-lecture-demande
Dans le processus normal de traitement des requêtes, il s'agit de la première étape où le module peut insérer des hooks. Cette étape peut être exploitée pour les modules souhaitant se lancer très en amont dans le traitement des requêtes.
2. Phase de traduction d'URI
La tâche principale d'Apache dans cette phase est de mapper l'URL demandée au système de fichiers local. Les modules peuvent insérer des hooks à ce stade pour exécuter leur propre logique de mappage. mod_alias utilise cette phase pour fonctionner.
3. Phase d'analyse de l'en-tête
La tâche principale d'Apache dans cette phase est de vérifier l'en-tête de la requête. Étant donné que le module peut effectuer la tâche de vérification des en-têtes de requête à tout moment du flux de traitement de la requête, ce hook est rarement utilisé. mod_setenvif utilise cette phase pour fonctionner.
4. Phase de contrôle d'accès
Le travail principal d'Apache dans cette phase : Vérifier si l'accès à la ressource demandée est autorisé selon le fichier de configuration. La logique standard d'Apache implémente les directives d'autorisation et de refus. mod_authz_host utilise cette phase pour fonctionner.
5. Étape d'authentification
Le travail principal d'Apache dans cette étape est d'authentifier les utilisateurs conformément à la politique définie dans le fichier de configuration et de définir la zone de nom d'utilisateur. Les modules peuvent insérer des hooks à ce stade pour implémenter une méthode d'authentification.
6. Phase d'autorisation
La tâche principale d'Apache dans cette phase est de vérifier si les utilisateurs authentifiés sont autorisés à effectuer l'opération demandée en fonction du fichier de configuration. Le module peut insérer des hooks à ce stade pour mettre en œuvre une méthode de gestion des droits des utilisateurs.
7. Phase de vérification du type MIME
La tâche principale d'Apache à ce stade est de déterminer la fonction de traitement de contenu à utiliser en fonction des règles liées au type MIME de la ressource demandée. Les modules standards mod_negotiation et mod_mime implémentent ce hook.
8. Phase de correction
Il s'agit d'une phase générale qui permet au module d'exécuter tout traitement nécessaire avant le générateur de contenu. Semblable à Post_Read_Request, il s'agit d'un hook qui peut capturer n'importe quelle information et est également le hook le plus couramment utilisé.
9. Étape de réponse
La tâche principale d'Apache dans cette étape est de générer le contenu renvoyé au client et d'être responsable de l'envoi d'une réponse appropriée au client. Cette étape est la partie centrale de l’ensemble du processus.
10. Phase de journalisation
Le travail principal d'Apache dans cette phase : enregistrer la transaction après l'envoi de la réponse au client. Les modules peuvent modifier ou remplacer la journalisation standard d'Apache.
11. Phase de nettoyage
Le travail principal d'Apache dans cette phase : nettoyer l'environnement laissé après la fin de cette transaction de requête, comme le traitement des fichiers et des répertoires ou la fermeture de Socket, etc. Ceci est traité par Apache en une seule requête La dernière étape.
Quatre couches de bas en haut :
①liunx appartient à la couche inférieure du système d'exploitation
②le serveur Apache, qui appartient au serveur secondaire et communique Linux et PHP
③php : C'est un langage de programmation côté serveur et est associé à Apache via le module php_module
④Mysql et autres services web : C'est un service d'application et est associé à mysql via le module de plug-in Extensions de PHP
Recommandations associées :
Explication détaillée du code graphique des principes et processus d'exécution de 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!