web-dev-qa-db-fra.com

Demandes 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 demandes de navigateur simultanées adressées au même script?

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

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

La directive MaxClients définit la limite du nombre de demandes simultanées qui seront traitées.
Toute tentative de connexion dépassant la limite MaxClients 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 autre demande, la connexion sera alors entretenue.


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

Alors :

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

Non ; sauf si :

  • il y a un verrou quelque part - qui peut se produire, par exemple, si les deux requêtes proviennent du même client et que vous utilisez 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 jusqu'à ce que la première requête soit terminé (et le fichier 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 mettent en file d'attente les demandes dans ce cas, même lorsqu'il n'y a rien côté serveur qui produit ce comportement.
  • il y a plus de MaxClients 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 tout à fait sympa, non?

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 sa propre instance de script?

Il n'y a rien de tel que " instance de script": en termes simples, ce qui se passe là où une demande de script est faite est:

  • le serveur Web fourche un autre processus pour gérer la demande (souvent, pour des raisons de performances, ces fourches sont faites à l'avance, mais cela ne change rien)
  • le processus lit le script PHP 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 de mémoire distinct pour chaque processus
  • le 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 envoyant une demande au même PHP script (ou à distinct PHP scripts que tous inclure le même PHP); ce n'est définitivement pas un problème, ou aucun des sites Web sur lesquels j'ai travaillé ne fonctionnerait!

138
Pascal MARTIN

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 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. En effet, 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, alias 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, 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. Une fois scripta.php 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é puis verrouillera le fichier de session et l'utilisera.

Ce processus continuera de se répéter pour éviter que plusieurs scripts écrivant dans le même fichier de session ne provoquent 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.

19
mauris

Je suis juste tombé dessus moi-même. Fondamentalement, 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'appelez, traitez les sessions en lecture seule à partir de ce moment.

4
Justin

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 arrive sur le serveur. Simultané les demandes seront traitées simultanément.

3
conceptDawg