Maison  >  Article  >  développement back-end  >  Comment fonctionne phpfpm ?

Comment fonctionne phpfpm ?

青灯夜游
青灯夜游original
2019-10-16 13:54:143644parcourir

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 des sous-processus, etc., et le processus de travail est responsable du traitement des requêtes PHP.

Comment fonctionne phpfpm ?

Principe de fonctionnement

php-fpm est conçu avec une architecture maître/travailleur, le front est simple Décrire les fonctions des modules de processus maître et travailleur. 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 :

Comment fonctionne phpfpm ?

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), chargement et analyse de la configuration php

b), chargement du module php et enregistrement 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), enregistrer la méthode de récupération de mémoire ; 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 et 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 travail

Le processus de travail est divisé en trois étapes : réception des demandes des clients, traitement des demandes et achèvement des demandes.

Comment fonctionne phpfpm ?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. Étape de traitement de la demande : appelez d'abord fpm_request_info et php_request_startup respectivement pour obtenir le contenu de la demande 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. Étape 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.

Pour plus de connaissances sur PHP, veuillez visiter le

site Web chinois 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!

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