2016-01-15 2 views
3

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

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

Чтобы подвести итог ситуации, я создал live test page.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']; 
?> 

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

ответ

1

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

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

+0

Спасибо за ваш ответ. Не могли бы вы прояснить простой пример? –

+0

Пример TrueBlueAussie достаточно хорош - решает это на стороне клиента;] – sp3c1

1

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

$(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); 

}); 
+0

Привет, просто проверил код на моем сервере. Это помогло немного, но сервер все еще не работает. Разве сервер не может обрабатывать около 10 запросов в секунду? –

1

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; 
     }); 
    } 
}); 
+0

Thankyou. Но код не работает на моем сервере. –

+0

@SushangNirola какая ошибка вы получаете? –

+0

Нет, код не возвращает никакого вывода. –

2

Как вы, кажется, хотите установку типа автозаполнения, используйте таймер. Сбросьте его на каждое нажатие клавиши и после задержки отправьте сообщение. В этом примере он отправит 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.

+0

Привет, спасибо. Код, похоже, работает. Я сократил время до 1 секунды. Что, если 50 запросов пользователя одновременно, сервер спустится? –

+1

Зависит от сервера. Я думаю, что это обычно количество запросов от одного и того же пользователя. Вы не отправляете до 60 запросов в минуту, а некоторые могут перекрываться. Лучше всего сбросить время, пока выполняется другой запрос Ajax, и не отправлять другой запрос одновременно :) –

Смежные вопросы