php-fpm est une architecture multi-processus maître (principal)/travailleur (enfant), qui est quelque peu similaire au style de conception nginx. Le processus maître est principalement responsable de l'initialisation des environnements CGI et PHP, de la surveillance des événements, de l'état du processus enfant, etc., et le processus de travail est responsable du traitement des requêtes PHP.
Avant d’introduire le principe de fonctionnement, comprenons d’abord ses différents modes de fonctionnement.
Mode d'exécution
php-fpm prend en charge trois modes d'exécution, à savoir statique, à la demande et dynamique. La valeur par défaut est dynamique.
static : mode statique, qui alloue un processus de travail fixe au démarrage.
ondemand : allouez à la demande, lancez le processus de travail lorsqu'une demande d'utilisateur est reçue.
dynamique : Mode dynamique, qui attribue un processus fixe au démarrage. À mesure que le nombre de requêtes augmente, le processus de travail est ajusté dans la plage flottante définie.
Ces trois modes ont leurs propres mérites, et vous pouvez ajuster la configuration correspondante en fonction de différents environnements.
Ce qui suit est le sujet de cet article, axé sur le principe de fonctionnement de php-fpm.
Recommandations associées : "Tutoriel de démarrage PHP"
Principe de fonctionnement
php-fpm est conçu avec master/worker Les fonctions des modules de processus maître et travailleur sont brièvement décrites ci-dessus. Les principes de fonctionnement de ces deux modules seront expliqués en détail ci-dessous.
processus maître
Le workflow du processus maître est divisé en 4 étapes, comme indiqué ci-dessous :
1 . Phase d'initialisation cgi : appelez respectivement les fonctions fcgi_init() et sapi_startup(), enregistrez les signaux de processus et initialisez la variable globale sapi_globals.
2. Phase d'initialisation de l'environnement PHP : déclenchée par cgi_sapi_module.startup. La fonction php_cgi_startup est en fait appelée et php_cgi_startup appelle en interne php_module_startup pour l'exécution.
Principales fonctions de php_module_startup :
a). Charger et analyser la configuration php
b) Charger le module php et l'enregistrer dans la table des symboles de fonction (function_table) ;
c). Charger l'extension Zend ;
d). Définir les fonctions désactivées et la configuration de la bibliothèque de classes ;
e). 3. Phase d'initialisation php -fpm : exécutez la fonction fpm_init(). Responsable de l'analyse de la configuration du fichier php-fpm.conf, de l'obtention des paramètres liés au processus (le nombre maximum de fichiers autorisés à être ouverts par le processus, etc.), de l'initialisation du pool de processus et du modèle d'événement, ainsi que d'autres opérations.
4. Phase d'exécution de php-fpm : exécutez la fonction fpm_run(), et le processus principal sera bloqué après l'exécution. Cette phase est divisée en deux parties : le processus enfant du fork et l'événement de boucle.
La partie du processus enfant fork est gérée par la fonction fpm_children_create_initial (Remarque : le mode à la demande est créé dans la fonction fpm_pctl_on_socket_accept).
La partie événement de boucle est traitée via la fonction fpm_event_loop, qui est une boucle infinie à l'intérieur et est responsable de la collection d'événements.
Processus de travailLe processus de travail est divisé en trois étapes : réception des demandes des clients, traitement des demandes et achèvement des demandes.
1. Recevoir la demande du client : exécutez la fonction fcgi_accept_request, qui obtient en interne la demande du client en appelant la fonction accept.
//请求锁 FCGI_LOCK(req->listen_socket); req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len); //释放锁 FCGI_UNLOCK(req->listen_socket);
À partir du code ci-dessus, vous pouvez remarquer qu'il y a une opération de verrouillage de demande avant d'accepter. Cette conception vise à éviter le phénomène de « choc » des demandes. Bien entendu, il s’agit d’une option facultative et la fonctionnalité peut être désactivée.
2. Phase de traitement de la requête : appelez d'abord fpm_request_info et php_request_startup respectivement pour obtenir le contenu de la requête et enregistrez les variables globales ($_GET, $_POST, $_SERVER, $_ENV, $_FILES) puis appelez php_fopen_primary_script pour y accéder ; selon les informations de la demande Fichier de script ; finalement remis à php_execute_script pour exécution. php_execute_script appelle en interne la méthode zend_execute_scripts pour transmettre le script au moteur Zend pour traitement.
3. Phase de fin de requête : exécutez la fonction php_request_shutdown. À ce stade, la fonction enregistrée par register_shutdown_function et la méthode __destruct() sont rappelées pour envoyer le contenu de la réponse, libérer de la mémoire et d'autres opérations.
Résuméphp-fpm est conçu avec une architecture maître/travailleur Le processus maître est responsable des opérations d'initialisation et de surveillance des événements des environnements publics CGI et PHP. Le processus de travail est responsable des fonctions de traitement des demandes. Lorsque le processus de travail traite la demande, il n'est pas nécessaire de réinitialiser à nouveau l'environnement d'exécution PHP, ce qui est l'une des raisons des excellentes performances de php-fpm.
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!