89 votes

Requêtes simultanées à PHP script

Si le moteur PHP est déjà en train d'exécuter un script sur le serveur, qu'arriverait-il aux autres requêtes simultanées du navigateur vers le même script ?

  • Les demandes seront-elles mises en file d'attente ?
  • Seront-ils ignorés ?
  • Chaque demande aura-t-elle son propre script ? instance ?
  • Une autre possibilité ?

1 votes

142voto

Pascal MARTIN Points 195780

Le serveur, en fonction de sa configuration, peut généralement servir des centaines de demandes en même temps -- si vous utilisez Apache, le MaxClients l'option de configuration est l'option qui dit :

El MaxClients définit la directive limite le nombre d'utilisateurs simultanés simultanées qui seront servies.
Toute Toute tentative de connexion sur le MaxClients sera normalement en file d'attente, jusqu'à un nombre basé sur la directive directive ListenBacklog.
Une fois qu'un processus enfant est libéré à la fin d'une requête différente, la connexion sera la connexion sera alors desservie.

Le fait que deux clients demandent la même page n'est pas un problème.

Donc :

Les demandes seront-elles mises en file d'attente ?

Non ; sauf si :

  • il y a des serrure quelque part - ce qui peut se produire, par exemple, si les deux requêtes proviennent du même client et que vous utilisez la fonction sessions basées sur des fichiers en PHP : pendant l'exécution d'un script, la session est "verrouillée", ce qui signifie que le serveur/client devra attendre la fin de la première demande. (et le dossier déverrouillé ) pour pouvoir utiliser le fichier afin d'ouvrir la session pour le deuxième utilisateur.
  • les demandes proviennent du même client ET du même navigateur ; la plupart des navigateurs mettent les demandes en file d'attente dans ce cas, même si rien du côté du serveur ne produit ce comportement.
  • il y a plus de MaxClients les processus actuellement actifs -- voir la citation du manuel d'Apache juste avant.

Seront-ils ignorés ?

Non : cela signifierait qu'un seul utilisateur peut utiliser un site web en même temps ; ce ne serait pas très agréable, n'est-ce pas ?

Si c'était le cas, je ne pourrais pas poster cette réponse, si vous tapez F5 au même moment pour voir si quelqu'un a répondu !
(Bon, SO n'est pas en PHP, mais les principes sont les mêmes)

Une autre possibilité ?

Oui ^^

modifier après avoir modifié l'OP et le commentaire :

Chaque demande aura-t-elle son propre script ? instance ?

Il n'existe pas de " script instance " : en clair, ce qui se passe là où une requête à un script est faite est :

  • le serveur web bifurque autre processus pour traiter la demande (souvent, pour des raisons de performance, ces bifurcations sont faites à l'avance, mais cela ne change rien)
  • le processus lit le script PHP depuis le disque.
    • plusieurs processus peuvent le faire en même temps : il n'y a pas de verrouillage sur la lecture du fichier
    • le fichier est chargé en mémoire ; dans un bloc mémoire distinct pour chaque processus
  • le fichier PHP en mémoire est " compilé " aux opcodes -- toujours en mémoire
  • ces opcodes sont exécutés -- toujours à partir du bloc de mémoire qui appartient au processus qui répond à votre demande

Vraiment, vous pouvez avoir deux utilisateurs qui envoient une requête au même script PHP. (ou à des scripts PHP distincts qui incluent tous le même fichier PHP) ; ce n'est certainement pas un problème, sinon aucun des sites web sur lesquels j'ai travaillé ne fonctionnerait !

0 votes

Si plusieurs requêtes simultanées accèdent au même fichier php, quel serait le résultat. les autres requêtes seront-elles maintenues en attente ou chaque requête aura sa propre script instance ?

3 votes

Il n'existe pas d'"instance de script" : chaque requête est traitée par un processus (ou thread) distinct ; ; les script sont lus à partir de la mémoire/disque, mais le même fichier peut être lu par plusieurs processus en même temps sans problème (du moins, sur les systèmes d'exploitation "modernes" -- c'est-à-dire Windows et Linux).

0 votes

Il s'agit d'une excellente réponse. Où pourrais-je obtenir plus de détails sur le fonctionnement de PHP ? Y a-t-il un bon livre pour cela ?

22voto

mauris Points 19666

Si deux clients appellent le serveur en même temps, le serveur est très probablement capable de répondre aux deux clients presque simultanément. Les clients sont définis ici au niveau du navigateur.

Cela signifie que sur la même machine, si vous utilisez deux navigateurs pour charger le même site/la même page en même temps, les deux devraient être chargés en même temps.

Cependant, puisque nous parlons de PHP, vous devez prendre des notes spéciales sur les sessions. Si vos pages utilisent des sessions, le serveur ne servira qu'une seule page à la fois. C'est parce que le fichier de session sera verrouillé, jusqu'à ce qu'un script sorte.

Regardez cet exemple. Les 2 fichiers sont chargés depuis la même session, c'est-à-dire le même navigateur et le même utilisateur.

      scripta.php requested                 scripta.php served
------+---+---------------------------------+------------------------>
          scripta.php started

               scriptb.php requested           scriptb.php started
---------------+-------------------------------+-----------------+--->
                                                                 scriptb.php served.

Remarquez que scriptb.php n'est lancé qu'après que scripta.php ait été servi. Ceci est dû au fait que lorsque scripta.php est lancé, le fichier de session est verrouillé aux autres scripts afin que scripta.php puisse écrire dans le fichier de session. Lorsque scripta.php se termine, le fichier de session est déverrouillé et donc les autres scripts peuvent l'utiliser. Ainsi scriptb.php attendra que le fichier de session soit libéré puis il verrouillera le fichier de session et l'utilisera.

Ce processus se répétera pour éviter que plusieurs scripts n'écrivent dans le même fichier de session, ce qui entraînerait des retards. Il est donc recommandé d'appeler session_write_close () lorsque vous n'utilisez plus la session, notamment sur un site web utilisant de nombreuses iframes ou AJAX.

5voto

Justin Points 4591

Je viens juste de rencontrer ça moi-même. En gros, vous devez appeler session_write_close() pour empêcher le verrouillage par un seul utilisateur. Assurez-vous qu'une fois que vous appelez session_write_close() Mais n'essayez pas de modifier les variables de session. Une fois que vous l'avez appelé, traitez les sessions comme étant en lecture seule à partir de ce moment-là.

3voto

conceptDawg Points 672

À moins que vous n'utilisiez une configuration non standard, votre serveur web (Apache, IIS, nginx, etc.) aura plusieurs processus qui exécuteront PHP séparément pour chaque requête qui arrive sur le serveur. Les requêtes simultanées seront traitées simultanément.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X