web-dev-qa-db-fra.com

Pourquoi les demandes HTTP sont-elles bloquées en attente dans Chrome?

Versions de langue/outil:

  1. @ angulaire/cli: 1.2.0
  2. PHP 7.0.8
  3. Zend Expressive 2
  4. Apache 2.4.23
  5. Chrome 65.0.3325.181
  6. Windows 7

Problème:

J'ai une application Angular2 qui utilise une application PHP comme API pour toutes les requêtes XHR. L'application fonctionne correctement mais lorsque l'option Use a prediction service to load pages more quickly Est activée dans Chrome et lorsque le l'application est rechargée Les requêtes HTTP envoyées à l'intérieur de ngOnInit() du composant sont bloquées très longtemps. Soit la requête se résoudra d'elle-même après 10s-2-3 minutes, etc. ou la ou les requêtes seront également résolues si j'envoie une autre demande (par exemple, une demande lors d'un événement de clic sur le DOM)

Choses que j'ai essayées:

  1. J'ai parcouru plusieurs articles (tels que 1 , 2 , , etc.) avec un problème similaire mais aucun n'était très utile, j'ai lu que cela pourrait se produire si j'ai plusieurs nombres de requêtes HTTP. Dans mon cas, j'ai essayé d'isoler les demandes et maintenant je n'envoie qu'une seule demande lors de l'initialisation du composant. Même une seule demande est bloquée. Ma console affichera une demande GET échouée, puis attendra, une fois la résolution terminée, il y aura une demande OPTIONS réussie, puis une GET réussie.
  2. Je n'étais pas sûr que ce soit un problème avec mon frontend Angular application ou le backend PHP application, donc lors de l'initialisation du composant, j'ai appelé une API aléatoire point de terminaison: http://api.randomuser.me/ plutôt que de demander mon point de terminaison d'API. Dans ce cas, la demande réussit sans délai (bien qu'elle affiche des erreurs CORS). Je pense donc que le problème réside dans mon API principale ou le serveur Web Apache.
  3. J'ai essayé de voir si quelque chose était à l'origine du retard dans l'API, mais le point d'entrée de l'application lui-même n'est pas atteint tant que la demande n'a pas abouti depuis le navigateur.

Je voudrais également partager ma configuration d'hôte virtuel. Si vous rencontrez des problèmes:

<VirtualHost *:80>
ServerName someName.api
DocumentRoot path_to_public_dir
SetEnv APPLICATION_ENV development
<Directory path_to_public_dir>

    SetEnvIf Origin "http(s)?://(www\.)?(local\.)?(localhost:4200|someDomain.com)$" AccessControlAllowOrigin=$0
    Header always set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin

    RewriteEngine On 

    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} –d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^.*$ index.php [NC,L]
    Options -Indexes +MultiViews +FollowSymLinks
    AllowOverride none
    Order Allow,Deny
    Allow from all
</Directory>

Notez s'il vous plaît:

  • J'ai également essayé de définir l'en-tête Access-Control-Allow-Origin Dans l'application elle-même, mais toujours pas de chance.
  • L'application fonctionne très bien sur Mozilla ou sur Chrome lorsque le service de prédiction n'est pas activé

Vos suggestions/réponses sur quelles pourraient être les causes possibles d'un tel comportement seraient vraiment utiles.

12
xyz

Eh bien, je pense que faire ce qui suit a supprimé le décalage de ma machine.

Avant la solution, voici mes hypothèses:

  1. Chrome effectue des demandes parallèles chaque fois que "le service de prédiction pour charger rapidement les pages est activé"
  2. Mon serveur Web Apache ne gérait pas ces demandes parallèles.

Solution:

  1. J'ai inclus le fichier de modules mpm pour Apache. Vous pouvez trouver la ligne ci-dessous dans le fichier httpd.conf:

    #Include conf/extra/httpd-mpm.conf Et décommentez-le.

    Windows utilise le mpm_winnt_module pour mpm.

    Ce module multi-traitement (MPM) est la valeur par défaut pour les systèmes d'exploitation Windows NT. Il utilise un seul processus de contrôle qui lance un seul processus enfant qui à son tour crée des threads pour gérer les demandes

  2. Trouvez les lignes ci-dessous et décommentez-les:

    EnableMMAP off        
    EnableSendfile on
    
    AcceptFilter http none
    AcceptFilter https none
    
    #Extra Notes
    #mmap is memory map by Apache, don't know I have uncommented this, had read about
    this somewhere, but anyway its Off so should not be a Burden on OS
    #EnableSendFile:Delivering static files? This link may help:
    https://groups.drupal.org/node/68333
    #AcceptFilter: windows mpm module, suggests to keep it as none. 
    I went through this : https://httpd.Apache.org/docs/2.4/mod/core.html
    and have set AcceptFilter http/https as "connect", it works fine for me. 
    Please note: I am using Apache 2.4.23
    
  3. Redémarrez votre Apache

C'est ça!

Je laisse cette question non acceptée car:

  1. Je ne sais pas si ce que j'ai fait est bien.
  2. Bien que j'aie activé le module winnt, je n'ai trouvé le fichier de module nulle part dans mon répertoire Apache, bien que les changements dans ThreadsPerChild soient reflétés, je suppose qu'Apache n'a pas besoin d'un module externe winnt .
  3. Bien que je puisse observer que la vitesse de chargement des pages a augmenté et que les demandes ne sont plus bloquées, je peux toujours voir les demandes failed and finshed Entrelacées pour chaque demande dans ma console chrome.

Vos réponses seront vraiment précieuses et rendront les choses plus claires.

6
xyz

Ce problème se produit en raison de votre vitesse Internet lente. Lorsque onInit () appelle, il charge tous les services Web et attend la fin du premier service Web. Lorsque l'exécution du premier service est terminée, le deuxième service commencera à s'exécuter mais il était toujours en attente par conséquent, il vous montre "En attente" dans la colonne d'état du réseau

0
Omkar Jadhav