Jetons un coup d'œil au processus suivant :
• Nous n'avons jamais démarré manuellement le processus lié à PHP, il s'exécute au démarrage d'Apache • PHP est connecté à Apache via le module mod_php5.so (plus précisément SAPI, l'interface de programmation d'applications serveur) ;
• PHP a un total de trois modules : le noyau, le moteur Zend et la couche d'extension
• PHP ; le noyau est utilisé pour gérer les requêtes, les flux de fichiers, la gestion des erreurs et d'autres opérations associées ;
• Le moteur Zend (ZE) est utilisé pour convertir les fichiers sources en langage machine, puis l'exécuter sur une machine virtuelle
• L'extension ; La couche est un ensemble de fonctions, de bibliothèques et de flux que PHP utilise pour effectuer des 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 "request initialization". Un exemple classique est le RINIT du module Session. Si le module Session est activé dans php.ini, la variable $_SESSION sera initialisée et le contenu pertinent sera lu lorsque le RINIT du module sera appelé
• ; 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 */ }
• Une fois la page exécutée Lorsqu'elle est terminée (qu'elle atteigne la fin du fichier ou qu'elle soit terminée avec la fonction exit ou die), PHP lancera le programme de nettoyage. Il appellera la méthode RSHUTDOWN de chaque module dans l'ordre.
• RSHUTDOWN est utilisé pour effacer la table des symboles générée lors de l'exécution du programme, c'est-à-dire appeler la fonction unset sur chaque variable.
Une méthode RSHUTDOWN typique est la suivante :
PHP_RSHUTDOWN_FUNCTION(extension_name) { /* Do memory management, unset all variables used in the last PHP call etc */ }
• 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.
Une méthode RSHUTDOWN typique est la suivante :
PHP_MSHUTDOWN_FUNCTION(extension_name) { /* Free handlers and persistent memory etc */ }
Ce qui suit est illustré de quelques illustrations !
Comme le montre l'image, PHP est un système à 4 couches de bas en haut
①Moteur Zend
Zend est implémenté en C pur et est la partie centrale de PHP. Il traduit le code PHP (lexical). et syntaxe) analyse et une série de processus de compilation) pour traiter les opcodes exécutables et implémenter les méthodes de traitement correspondantes, implémenter les structures de données de base (telles que la table de hachage, oo), l'allocation et la gestion de la mémoire, et fournir les méthodes API correspondantes pour les appels externes. Le noyau, toutes les fonctions périphériques sont implémentées autour de Zend.
②Extensions
Autour du moteur zend, les extensions fournissent divers services de base basés sur des composants. Nos diverses fonctions intégrées communes (telles que les séries de tableaux), les bibliothèques standard, etc. sont toutes implémentées via des extensions, et les utilisateurs peuvent également implémenter leur propre extension si nécessaire pour réaliser l'expansion des fonctions, l'optimisation des performances et à d'autres fins (par exemple, la couche intermédiaire PHP et l'analyse de texte enrichi actuellement utilisées par Tieba sont des applications typiques d'extension).
③Sapi
Le nom complet de Sapi est Server Application Programming Interface, qui est l'interface de programmation d'application serveur Sapi permet à PHP d'interagir avec les données périphériques via une série de fonctions de hook. PHP. Grâce à SAPI, il réussit à découpler et à isoler PHP lui-même des applications de couche supérieure. PHP ne peut plus réfléchir à la manière d'être compatible avec différentes applications, et l'application elle-même peut également implémenter différentes méthodes de traitement en fonction de ses propres caractéristiques. Il sera présenté plus tard dans le chapitre sapi
④Application de couche supérieure
Il s'agit du programme PHP que nous écrivons habituellement. Nous pouvons obtenir différents modes d'application via différentes méthodes sapi, telles que l'implémentation d'applications Web via un serveur Web et l'utilisation de la commande. ligne Exécuter en tant que script et plus encore.
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 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 Cars run on the road.
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 installons sont Apache2 et Php5, alors vous devez é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 URL reçue dans le futur avec php comme suffixe doit être traitée en appelant le module php5_module (mod_php5.so/php5apache2.dll).
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. Étape d'analyse de l'en-tête
Le travail principal d'Apache dans cette étape : 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
Le travail principal d'Apache dans cette étape : déterminer la fonction de traitement de contenu à utiliser selon les règles pertinentes du 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. Phase de réponse
La tâche principale d'Apache dans cette phase 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 les transactions 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 : appartient au langage de programmation côté serveur, et est associé à Apache via le module php_module
④mysql et autres services web : appartient aux services d'application, et est associé avec mysql via le module plug-in Extensions 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!