Requêtes simultanées au script PHP

85

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 sur le même script?

  • Les demandes seront-elles mises en file d'attente?
  • Seront-ils ignorés?
  • Chaque requête aura-t-elle sa propre instance de script?
  • Une autre possibilité?
Kevin Boyd
la source
1
Vérifiez également cette réponse: konrness.com/php5/how-to-prevent-blocking-php-requests
trante

Réponses:

140

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

La MaxClientsdirective fixe la limite du nombre de demandes simultanées qui seront servies.
Toute tentative de connexion dépassant la MaxClients limite sera normalement mise en file d'attente, jusqu'à un nombre basé sur la directive ListenBacklog.
Une fois qu'un processus enfant est libéré à la fin d'une demande différente, 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 un verrou quelque part - ce qui peut arriver, par exemple, si les deux requêtes proviennent du même client, et que vous utilisez des sessions basées sur des fichiers en PHP : pendant qu'un script est en cours d'exécution, la session est "verrouillée", ce qui signifie que le serveur / client devra attendre que la première demande soit terminée (et que le fichier soit déverrouillé ) pour pouvoir utiliser le fichier pour ouvrir la session pour le deuxième utilisateur.
  • les demandes proviennent du même client ET du même navigateur; la plupart des navigateurs mettront les requêtes en file d'attente dans ce cas, même s'il n'y a rien côté serveur produisant ce comportement.
  • il y a plus que MaxClientsles 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 à la fois; ce ne serait pas très bien, 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 a répondu!
(Eh bien, SO n'est pas en PHP, mais les principes sont les mêmes)


Une autre possibilité?

Oui ^^


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

Chaque requête aura-t-elle sa propre instance de script?

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

  • le serveur Web lance un autre processus pour traiter la demande (souvent, pour des raisons de performances, ces forks sont effectués à l'avance, mais cela ne change rien)
  • le processus lit le script PHP à partir du disque
    • plusieurs processus peuvent le faire en même temps : il n'y a pas de verrouillage sur la lecture des fichiers
    • le fichier est chargé en mémoire; dans un bloc mémoire distinct pour chaque processus
  • le fichier PHP en mémoire est " compilé " en opcodes - toujours en mémoire
  • ces opcodes sont exécutés - toujours à partir du bloc de mémoire qui appartient au processus répondant à 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, ou aucun des sites Web sur lesquels j'ai travaillé ne fonctionnerait!

Pascal MARTIN
la source
Si plusieurs requêtes simultanées accèdent au même fichier php, quel en serait le résultat. les autres requêtes seront-elles maintenues en attente ou chaque requête aura sa propre instance de script?
Kevin Boyd
3
Il n'existe pas de "script instance": chaque requête est traitée par un processus (ou thread) distinct ;; les scripts sont lus depuis la mémoire / le disque, mais le même fichier peut être lu à partir de nombreux processus en même temps sans problème (au moins, sur les systèmes d'exploitation "modernes" - c'est-à-dire à la fois Windows et Linux)
Pascal MARTIN
C'est une excellente réponse, où pourrais-je en savoir plus sur le fonctionnement de PHP? Un bon livre pour ça?
Kevin Boyd
1
Je ne sais pas vraiment à ce sujet: je suppose que parcourir le manuel, lire des articles sur le net, des questions / réponses ici et là, et travailler avec PHP pendant plusieurs années sont une bonne façon d'apprendre - mais je peux ' Je recommande vraiment tout livre qui expliquerait exactement comment fonctionne PHP ;; il y a quelques informations dans "Extension et intégration de PHP", mais son objet n'est pas d'expliquer comment fonctionne PHP ;; peut-être que php.net/manual/en/internals2.php peut vous aider?
Pascal MARTIN
La perfection ! M'a beaucoup aidé!
zookastos
21

Si 2 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 ici, je les définis au niveau du navigateur.

Cela signifie que sur la même machine, si vous utilisez 2 navigateurs pour charger le même site Web / page en même temps, 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 seule page à la fois. Cela est dû au fait que le fichier de session sera verrouillé jusqu'à ce qu'un script se termine.

Regardez cet exemple. Les 2 fichiers sont chargés à partir de la même session aka 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'après la diffusion de scripta.php. c'est parce que lorsque scripta.php a démarré, le fichier de session est verrouillé sur d'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 d'autres scripts peuvent donc l'utiliser. Ainsi, scriptb.php attendra que le fichier de session soit libéré, puis il verrouille le fichier de session et l'utilise.

Ce processus continuera à se répéter pour empêcher l'écriture de plusieurs scripts dans le même fichier de session entraînant 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.

Mauris
la source
4

Je suis tombé dessus moi-même. En gros, vous devez appeler session_write_close()pour empêcher le verrouillage d'un seul 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'avez appelé, traitez les sessions en lecture seule à partir de là.

Justin
la source
3

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 requête qui arrive sur le serveur. Les demandes simultanées seront traitées simultanément.

conceptDawg
la source