web-dev-qa-db-fra.com

Pourquoi Apache ne peut-il pas gérer plusieurs demandes en même temps?

J'ai installé AMPPS.

Mon serveur Apache ne peut pas gérer plusieurs requêtes php à la fois (par exemple, si j'appelle localhost/script.php plusieurs fois, elles sont traitées dans un ordre consécutif). script.php se compose uniquement de <?php sleep(10); ?>.

J'ai lu que la directive MaxClients est responsable de la configuration de l'accès simultané, mais que celle-ci manque dans mon httpd.conf.

Désactiver Xdebug et écrire session_write_close(); au début du script ne fonctionnaient pas.

Quand j'ai ajouté session_start(); au début du fichier et que mon code ressemblait à ceci:

<?php

session_start();
session_write_close();
sleep(10);
phpinfo();

echo "Done";

Lors de 5 demandes à localhost/script.php, les 4 dernières ont attendu la fin de la première, puis se sont terminées simultanément.

S'il vous plaît, aidez-moi à résoudre le problème. Si des informations nécessaires pour m'aider à résoudre ce problème sont manquantes, veuillez en informer et je l'ajouterai.

7
nicks

apcahe peut sûrement gérer plusieurs requêtes en même temps, il y a sûrement quelque chose qui ne va pas dans votre configuration Apache.

Cela dépend de la version d'Apache que vous utilisez et de sa configuration, mais une configuration par défaut courante fait appel à plusieurs travailleurs dotés de plusieurs threads pour gérer des requêtes simultanées. Voir http://httpd.Apache.org/docs/2.2/mod/worker.html pour un aperçu de la façon dont cela fonctionne.

La raison de votre confrontation est la suivante: 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 dans PHP: lors de l'exécution d'un script, la session est "verrouillée", ce qui signifie que le serveur/client devra attendre que la première requête soit terminée (et le fichier déverrouillé) pour pouvoir utiliser le fichier afin d'ouvrir le fichier. session pour le 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.

15
kshitij

Probablement parce que des sessions se verrouillent. Lorsque vous n'avez pas besoin de modifier les variables de session, fermez-le.

http://php.net/manual/en/function.session-write-close.php

4
Viktor Koncsek

manipulez vos sessions en écriture au début de script.php

// manipulate writes, and unlock session file!
session_start();
$_SESSION['admin'] = 1;
$_SESSION['user'] = 'Username';
session_write_close(); // unlock session file, to another script can access

// start your script without php session block
sleep(30); 
echo $_SESSION['user'];

// another script can run without wait this script finish
1
Leonardo Filipe

Essayez d'inclure le sommeil et phpinfo dans la session avant d'appeler la fermeture de la session. Comme cela ressemble aux sessions (toutes les cinq sont traitées de la même façon et se terminent par la première). Peut-être vérifier si les identifiants de session sont les mêmes. En gardant la session ouverte, vous pouvez voir qu’ils sont gérés simultanément.

0
Kumar

Apache fournit une variété de modules multitraitement (ces MPM sont appelés par Apache) qui dictent la manière dont les demandes des clients sont traitées. En gros, cela permet aux administrateurs d’échanger facilement l’architecture de traitement des connexions. Ceux-ci sont:

  1. mpm_prefork: Ce module de traitement génère des processus avec un seul thread pour gérer la demande. Chaque enfant peut gérer une seule connexion À la fois.
  2. mpm_worker: Ce module génère des processus pouvant chacun gérer plusieurs threads. Chacun de ces threads peut gérer une seule connexion . Puisqu'il y a plus de threads que de processus, cela signifie également que les nouvelles connexions peuvent immédiatement prendre un thread libre au lieu d'attendre un processus libre.
  3. mpm_event: Ce module est similaire au module worker dans la plupart des situations , mais il est optimisé pour gérer les connexions persistantes. Lorsque Utilise le MPM de l'ouvrier, une connexion tiendra un thread indépendamment du fait que Soit active ou non, tant que la connexion Est maintenue active. 
0
swaroop suthar

J'ai rencontré un problème similaire. Plusieurs demandes étaient suspendues de manière aléatoire lors de la connexion au serveur.

J'ai essayé de changer les configurations mpm, sans aucune utilisation.

Enfin, celui-ci semble résoudre le problème pour moi. (from https://serverfault.com/a/680075 )

AcceptFilter http none
EnableSendfile Off 
EnableMMAP off 
0
Thiagesh thg

Avez-vous essayé de faire des appels simultanés avec différents onglets/fenêtres/instances du navigateur? 

Apache est multithread, il peut donc gérer vos requêtes parallèles. Il semble que vous ayez des choses à vérifier:

  • Effectuez des demandes avec un client approprié pour effectuer des tests (comme Apache Benchmark) - Consultez https://httpd.Apache.org/docs/2.4/programs/ab.html

  • Vérifiez votre configuration sur Apache. Certaines configurations incorrectes peuvent produire un comportement étrange, par exemple une requête unique à la fois. Examinez les paramètres fork et worker à httpd.conf. Suggestion: utilisez tous les paramètres par défaut pour les tests.

0
Tiago Luz