在$ .POST上获取ERR_EMPTY_RESPONSE

时间:2016-01-15 15:25:28

标签: javascript php jquery ajax cors

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

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

5 个答案:

答案 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/

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

答案 1 :(得分:1)

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

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

答案 2 :(得分: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);

});

答案 3 :(得分: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;
         });
    }
 });

答案 4 :(得分:1)

这很好。

const sortorder =['self_owner','wife','mother','son','grand_child']
const arr = [
  {
    name: "Baburam",
    relation: "self_owner"
  },
  {
    name: "Prapti",
    relation: "grand_child"
  },
  {
    name: "Sanjay",
    relation: "son"
  },
  {
    name: "Bhagwati",
    relation: "wife"
  },
  {
    name: "maya",
    relation: "mother"
  },
]
let sorted = arr.sort((a,b) => sortorder.indexOf(a.relation) - sortorder.indexOf(b.relation));
console.log(sorted);