在$ .POST上获取ERR_EMPTY_RESPONSE

问题描述 投票:3回答:5

我有一个简单的社交网站,有聊天功能。我在多个页面中经常使用$.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'];
?>

我在墙上用力打了一个星期。所以,请帮我解决这个问题。提前致谢。对不起我的蹩脚英语。

javascript php jquery ajax cors
5个回答
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/

这样可以避免服务器过载,因为同一个用户每3秒钟发出的请求不超过1个。如果响应慢于3秒,您可能还需要在Ajax请求正在进行时禁用密钥处理程序。


1
投票

最简单的答案是,您允许您的服务器被垃圾邮件发送到它停止响应(但仍然收到新连接)。如果连接没有及时关闭(解决),你也会遇到对域的并发浏览器连接的限制(我认为这确实发生了 - 浏览器阻止你做出这些请求)。

您可以切换到套接字,也可以按设定的时间间隔将文本发送到服务器。或者你不允许下一篇文章,直到之前的决定。


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

});

1
投票

Ajax同步:使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;
         });
    }
 });

1
投票

这很好。

var waiting=false;

$(".abc").keyup(function(){

    if(!waiting){
         waiting = true;
         // code
         $.post('bbs.php',{a:a},function(abc){
            $(".showoff").html(abc);
            waiting=false;
         });
    }
 });
© www.soinside.com 2019 - 2024. All rights reserved.