Obtenir ERR_EMPTY_RESPONSE sur $ .POST

J'ai un site de réseautage social simple avec une fonctionnalité de chat. J'ai utilisé $.post beaucoup dans plusieurs pages. Le code fonctionne bien sur toutes les pages sauf message.php où le message utilisateur est affiché et récupéré plusieurs fois avec $.post (utilisé pour fonctionner correctement sur le serveur local).

Lorsque le messagerie entre les utilisateurs se produit de façon simulé, le site s'arrête pour répondre. Lors du rechargement, le serveur descend et le message ERR_EMPTY_RESPONSE s'affiche. Le site Web est à nouveau entré en service après quelques minutes. À ce que j'ai appris, cela se produit dans des pages qui utilisent souvent $ .post.

Pour résumer la situation, j'ai créé une page de test en direct . Un ERR_EMPTY_RESPONSE se produit lorsque l'entrée est donnée en continu pendant quelques secondes.
Contenu de la page:

A.php

 <script> $(document).ready(function(e) { $(".abc").keyup(function(){ var a = $(this).val(); $(".showoff").text("wait.."); $.post('bbs.php',{a:a},function(abc){ $(".showoff").html(abc); }); });}); </script> <input type="textbox" class="abc"> <div class="showoff">Type to Change Me!</div> 

Bbs.php

 <?php echo $_POST['a']; ?> 

Je frappe lourdement la tête au mur pendant une semaine. Alors, aidez-moi à résoudre ce problème. Merci d'avance. Désolé pour mon anglais boiteux aussi.

Comme vous semblez vouloir une configuration de type autocomplete, utilisez une minuterie. Réinitialisez-le à chaque pression de touche et après un délai, envoyez votre message. Dans cet exemple, il enverra 3 secondes après la dernière pression sur la touche.

 $(document).ready(function(e) { var timer; $(".abc").keyup(function() { var $input= $(this); // Start timer clearTimeout(timer); // Start a new 3 second timer timer = setTimeout(function() { // Once the var a = $input.val(); $(".showoff").text("wait.."); $.post('bbs.php', { a: a }, function(abc) { $(".showoff").html(abc); }); }, 3000); }); }); 

JSFiddle: https://jsfiddle.net/TrueBlueAussie/Locpnk35/

Cela évitera de surcharger votre serveur car plus de 1 requête toutes les 3 secondes peut provenir du même utilisateur. Si la réponse est plus lente que 3 secondes, vous devrez peut-être également désactiver le gestionnaire de clés pendant qu'une demande Ajax est en cours.

La réponse la plus simple serait que vous autorisez votre serveur à être spammé au point qu'il cesse de répondre (tout en recevant de nouvelles connexions). Si les connexions ne sont pas fermées (résolues) dans le temps, vous pouvez également accéder à la limitation des connexions simultanées du navigateur au domaine (ce qui, je pense, se produit réellement – un navigateur vous bloque en faisant ces demandes).

Vous pouvez soit passer aux sockets, soit envoyer du texte au serveur sur un intervalle de temps défini. Alternativement, vous ne permettez pas la prochaine publication, jusqu'à ce que la précédente soit résolue.

Au lieu de permettre à votre serveur d'être envoyé par courrier indésirable, vous pouvez supprimer le gestionnaire avant la première publication et la remettre à nouveau lorsque la publication revient.

 $(document).ready(function(e) { var $abc = $('.abc'); //good idea to cache those jQuery selectors! function abcPost() { $abc.off('keyup', abcPost) var a = $(this).val(); $(".showoff").text("wait.."); $.post('bbs.php', { a: a }, function(abc) { $(".showoff").html(abc); $abc.on('keyup', abcPost) }); } $abc.on('keyup', abcPost); }); 

Ajax syncronous : Créez l'appel ajax syncronous. Cela empêchera son thread jusqu'à ce que la réponse soit revenue, facile à mettre en œuvre, mais vient avec l'inconvénient que l'utilisateur ne peut plus taper jusqu'à la demande est résolu

 $.ajax({ url: 'bbs.php', data: {a:a}, success: function(abc){ $(".showoff").html(abc); }, async: false }); 

Vérification de variable globale: créez une variable globale qui vérifie l'état de la demande précédente et n'autorise pas les futurs jusqu'à ce qu'il soit résolu:

 var waiting=false; $(".abc").keyup(function(){ if(!waiting){ waiting = true; // code $.post('bbs.php',{a:a},function(abc){ $(".showoff").html(abc); waiting=false; }); } });