Получение ERR_EMPTY_RESPONSE на $ .POST

У меня есть простой сайт социальной сети с функциями чата. Я много раз использовал $.post на нескольких страницах. Код хорошо работает на всех страницах, кроме message.php, где сообщение пользователя отправляется и загружается несколько раз с $.post (используется для работы на локальном сервере).

Когда обмен сообщениями между пользователями происходит имитируемо, веб-сайт перестает отвечать. При перезагрузке сервер отключается и отображается сообщение ERR_EMPTY_RESPONSE. Веб-сайт снова вступает в действие через пару минут. К тому, что я узнал, это происходит на страницах, которые часто используют $ .post.

Чтобы подвести итог ситуации, я создал тестовую страницу . ERR_EMPTY_RESPONSE возникает, когда ввод задается непрерывно в течение нескольких секунд.
Содержание страницы:

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']; ?> 

Я целую неделю надавливаю на стену. Итак, пожалуйста, помогите мне с этой проблемой. Заранее спасибо. Извините за мой хромой английский.

Поскольку вам нужна настройка типа автозаполнения, используйте таймер. Сбросьте его на каждое нажатие клавиши и после задержки отправьте сообщение. В этом примере он отправит 3 секунды после последнего нажатия клавиши.

 $(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/

Это позволит избежать перегрузки сервера, так как не более 1 запроса каждые 3 секунды может поступать от одного и того же пользователя. Если ответ медленнее 3 секунд, вам также может потребоваться отключить обработчик ключа, пока выполняется запрос Ajax.

Простым ответом будет то, что вы позволяете вашему серверу быть спамом до такой степени, что он перестает отвечать (но все же получает новые соединения). Если соединения не закрыты (разрешены) вовремя, вы также столкнетесь с ограничением одновременных подключений браузера к домену (что, на мой взгляд, действительно происходит – браузер блокирует вас при выполнении этого запроса).

Вы либо переключаетесь на сокеты, либо отправляете текст на сервер с заданным интервалом времени. В качестве альтернативы вы не разрешаете следующую запись, пока не будет разрешено предыдущее.

Вместо того, чтобы разрешить спам серверу, вы можете удалить обработчик перед первым сообщением и снова установить его, когда сообщение вернется.

 $(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 : сделать синхронный вызов ajax. Это остановит его поток до тех пор, пока ответ не вернется, его легко реализовать, но он будет иметь недостаток, который пользователь не может напечатать до тех пор, пока запрос не будет разрешен

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

Глобальная проверка переменных: создайте глобальную переменную, которая проверяет состояние предыдущего запроса и не разрешает будущие до тех пор, пока не будет разрешена:

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