comment les requêtes concurrentes sont - elles traitées en PHP (en utilisant les processus-threads, thread pool ou child)?)

je comprends que PHP prend en charge plusieurs connexions simultanées et selon le serveur il peut être configuré comme mentionné dans ce réponse

comment le serveur gère-t-il les connexions multiples?est-ce qu'il bifurque un processus enfant pour chaque requête ou est-ce qu'il utilise des threads ou est-ce qu'il utilise un pool de threads?

Le lié réponse , dit un processus est fourchue et puis l'auteur comment dit threads ou process, ce qui le rend confus, si les requêtes sont servies en utilisant child-process, threads ou thread pool?

23
demandé sur Community 2015-11-10 10:14:47

3 réponses

comme je le sais, chaque serveur web a son propre type de traitement des requêtes multpile simultanées. Habituellement, un processus enfant pour chaque nouvelle requête. Mais vous pouvez en quelque sorte configurer ce comportement comme mentionné dans votre réponse StackOverflow liée.

Nginx par exemple obtient chaque requête dans un thread (traite les nouvelles connexions asynchrones comme un noeud.js fait) ou utilise parfois la mise en cache (telle que configurée; Nginx peut également être utilisé comme équilibreur de charge ou HTTP proxy.) Il s'agit de choisir le bon serveur web pour votre application.

Apache2 pourrait être un très bon serveur web, mais vous avez besoin de plus d'équilibrage quand vous voulez l'utiliser dans la production. Mais il a également une bonne puissance lorsqu'il a des connexions de courte durée ou même des documents qui ne changent pas du tout (ou en utilisant la mise en cache).

Nginx est très bon si vous vous attendez à beaucoup de connexions de longue durée avec un certain temps de traitement. Vous n'en avez pas besoin beaucoup d'équilibre alors.

j'espère que j'ai été en mesure de vous aider avec cela ;)

Sources:

https://httpd.apache.org/docs/2.4/mod/worker.html

https://anturis.com/blog/nginx-vs-apache /

je vous recommande de regarder aussi: Qu'est-ce que thread safe ou non-thread safe en PHP?

18
répondu jankal 2017-05-23 11:53:15

après avoir fait quelques recherches, je me suis retrouvé avec les conclusions ci-dessous.

il est important de considérer comment les serveurs PHP sont paramétrés pour être en mesure d'obtenir des informations à ce sujet.Pour configurer le serveur et PHP par vous-même, il peut y avoir trois possibilités:

1) en utilisant PHP comme module (pour de nombreux serveurs PHP a une interface directe de module (également appelé SAPI))

2) CGI

3) FastCGI

En considérant le cas # 1 PHP comme module, dans ce cas le module est intégré avec le serveur web lui-même et maintenant il met la balle entièrement sur le serveur web comment il gère les requêtes en termes de processus de bifurcation, en utilisant des threads, des piscines de thread, etc.

pour module, Apache mod_php semble être très couramment utilisé, et L'Apache lui-même gère les requêtes en utilisant des processus et des threads dans deux modèles comme mentionné dans ce réponse

Prefork MPM utilise plusieurs processus enfant avec un fil chacun et chaque processus traite une connexion à la fois.

utilisations du MPM Ouvrier plusieurs processus enfant avec de nombreux fils chacun. Chaque manche de fil une seule connexion à la fois.

évidemment, d'autres serveurs peuvent prendre d'autres approches mais, je ne suis pas au courant de la même.

pour #2 et #3, le serveur web et la partie PHP sont traités dans des processus différents, et la façon dont un serveur web traite la requête et la façon dont elle est traitée par application(partie PHP) varie. Par exemple: NGINX peut traiter la requête en utilisant des E/S asynchrones sans blocage et Apache peut traiter les requêtes en utilisant des threads, mais la façon dont la requête serait traitée par L'application FastCGI ou CGI est un aspect différent comme décrit ci-dessous. Les deux aspects, c'est-à-dire comment le serveur web traite les requêtes et comment la partie PHP est traitée, seraient importants pour la performance des serveurs PHP.

Considérant #2, le protocole CGI rend le serveur web et l'application (PHP) indépendants l'un de l'autre et le protocole CGI exige que l'application et le serveur web soient traités en utilisant des processus différents et le protocole ne favorise pas la réutilisation du même processus, ce qui signifie à son tour qu'un nouveau processus est nécessaire pour traiter chaque demande.

considérant#3, le protocole FastCGI surmonte les limitations de CGI en permettant la réutilisation des processus. Si vous cochez IIS FastCGI link FastCGI résout les problèmes de performance inhérents à CGI en fournissant un mécanisme pour réutiliser un seul processus encore et encore pour de nombreuses requêtes.

FastCGI maintient la compatibilité avec les bibliothèques non-thread-safe par fournir un bassin de processus réutilisables et s'assurer que chaque processus ne traite qu'une seule demande à la fois.

cela dit, dans le cas de FastCGI il apparaît que le serveur maintient un processus pool et il utilise le pool de processus pour traiter les demandes de clients entrants et depuis, le pool de processus ne nécessite pas de thread safe check, il fournit une bonne performance.

4
répondu prasun 2017-05-23 11:45:36

je pense que la réponse dépend de la façon dont le serveur web et le cgi se déploient.

dans mon entreprise, nous utilisons Nginx comme serveur web et php-fpm comme cgi, de sorte que la requête concurrente est traitée en tant que processus par php-FPM, et non en tant que thread.

nous configurons le nombre maximum de processus, et chaque requête est traitée par un seul processus php, si plus de requêtes(plus grand que le nombre maximum de processus) viennent , ils attendent.

donc, je crois que PHP lui-même peut soutenir chacun d'eux, mais comment l'utiliser, cela dépend.

3
répondu FisherMartyn 2015-12-04 06:02:46