Question

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

  • Les demandes seront-elles mises en file d'attente?
  • seront-ils ignorés?
  • Chaque requête aura-t-elle son propre script? exemple?
  • Une autre possibilité?
Était-ce utile?

La solution

Le serveur, en fonction de sa configuration, peut généralement traiter simultanément des centaines de demandes - si vous utilisez Apache, le MaxClients L'option de configuration proposée est la suivante:

  

La directive MaxClients définit la   limite sur le nombre de simultané   demandes qui seront servies.
Tout   tentatives de connexion sur le   La limite MaxClients sera normalement   en file d'attente, jusqu'à un nombre basé sur la   Directive ListenBacklog.
Une fois un enfant   processus est libéré à la fin d'un   demande différente, la connexion sera   puis être réparé.


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 existe un verrou quelque part - ce qui peut arriver, par exemple, si les deux demandes proviennent du même client et que vous utilisez des sessions basées sur des fichiers en PHP : lors de 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 requête (et le fichier déverrouillé ) pour pouvoir utilisez le fichier pour ouvrir la session du deuxième utilisateur.
  • les demandes proviennent du même client ET du même navigateur; la plupart des navigateurs mettront les demandes en file d'attente dans ce cas, même s'il n'y a rien qui produise ce comportement côté serveur.
  • il existe plus de MaxClients processus en cours - voir la citation du manuel d'Apache juste avant.


  

Seront-ils ignorés?

Non: cela signifie qu'un seul utilisateur peut utiliser un site Web à la fois. cela 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 frappiez F5 au même moment pour voir si quelqu'un répondait!
(Eh bien, 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?   exemple?

Il n’existe pas de " instance de script " : en termes simples, ce qui se passe lorsqu'une demande de script est faite est:

  • le serveur Web forks un autre processus pour traiter la demande (souvent, pour des raisons de performances, ces forks sont créés à 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 : la lecture de fichier n'est pas verrouillée
    • le fichier est chargé en mémoire; dans un bloc de 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 appartenant au processus répondant à votre demande


En réalité, vous pouvez demander à deux utilisateurs d'envoyer une demande au même script PHP (ou à des scripts PHP distincts contenant tous le même fichier PHP) ; ce n'est vraiment pas un problème, ou aucun des sites Web sur lesquels j'ai travaillé ne fonctionnerait!

Autres conseils

Si 2 clients appellent le serveur en même temps, le serveur est probablement en mesure de répondre aux deux clients presque simultanément. Les clients ici, je les définis au niveau du navigateur.

Cela signifie que sur le même ordinateur, si vous utilisez deux navigateurs pour charger le même site Web / la même page simultanément, les deux doivent ê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 sert qu'une page à la fois. En effet, le fichier de session sera verrouillé jusqu'à la fermeture du script.

Regardez cet exemple. Les 2 fichiers sont chargés à partir de la même session, autrement dit du même navigateur, même utilisateur.

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

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

Notez que scriptb.php n'est démarré qu'une fois scripta.php servi. En effet, lors du démarrage de scripta.php, le fichier de session est verrouillé sur d'autres scripts afin que scripta.php puisse écrire dans le fichier de session. Lorsque scripta.php est terminé, le fichier de session est déverrouillé et les autres scripts peuvent donc l'utiliser. Ainsi, scriptb.php attendra que le fichier de session soit libéré pour le verrouiller et l’utiliser.

Ce processus continuera à se répéter afin d'éviter que plusieurs scripts n'écrivent dans le même fichier de session, provoquant des retards. Il est donc recommandé d'appeler session_write_close () lorsque vous n'utilisez plus la session, en particulier sur un site Web utilisant de nombreux iframes ou AJAX.

Je suis juste tombé dessus moi-même. Fondamentalement, vous devez appeler session_write_close () pour empêcher le verrouillage mono-utilisateur. Assurez-vous qu'une fois que vous appelez session_write_close () , vous n'essayez pas de modifier les variables de session. Une fois que vous l’appelez, traitez les sessions en lecture seule à partir de ce moment-là.

Sauf si vous exécutez une configuration très non standard, votre serveur Web (Apache, IIS, nginx, etc.) aura plusieurs processus qui exécutent PHP séparément pour chaque demande qui parvient au serveur. Les demandes simultanées seront traitées simultanément.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top