【问题标题】:Getting ERR_EMPTY_RESPONSE on $.POST在 $.POST 上获取 ERR_EMPTY_RESPONSE
【发布时间】:2016-01-15 15:25:28
【问题描述】:

我有一个带有聊天功能的简单社交网站。我在多个页面中多次使用$.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


    【解决方案1】:

    由于您似乎需要自动完成类型设置,请使用计时器。在每次按键时重置它,并在延迟后发送您的帖子。在本例中,它将在最后一次按键后 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 秒。如果50个用户同时请求,服务器会宕机吗?
    • 取决于服务器。我认为问题通常是来自同一用户的请求数量。您不会每分钟发送多达 60 个请求,并且有些请求可能会重叠。最好在另一个 Ajax 请求正在进行时重置时间,而不是同时发送另一个请求:)
    【解决方案2】:

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

    您要么切换到套接字,要么在设定的时间间隔内向服务器发送文本。或者你不允许下一个帖子,直到上一个得到解决。

    【讨论】:

    • 感谢您的回答。可以举个简单的例子吗?
    • TrueBlueAussie 的例子已经足够好了——在客户端解决了这个问题;]
    【解决方案3】:

    您可以在第一个帖子之前删除处理程序,并在帖子返回时重新设置它,而不是让您的服务器被垃圾邮件发送。

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

    【讨论】:

    • 嗨,刚刚检查了我服务器上的代码。它帮助了一点,但服务器仍然关闭。是不是服务器一秒钟不能处理大约 10 个请求?
    【解决方案4】:

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

    【讨论】:

    • 永远不要建议将async: false 作为解决方案... 任何事情!这是一扇明亮闪亮的门,通向非常黑暗的地方。始终使用浏览器的异步模型,否则您将在浏览器处理请求时锁定浏览器。在这种情况下,它几乎会永久锁定它(在每次按键时)。你的第二个选择更好。
    【解决方案5】:

    这很好。

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

    【讨论】:

      猜你喜欢
      • 2020-05-07
      • 2018-08-06
      • 2016-04-30
      • 2016-03-09
      • 2017-10-11
      • 2019-08-19
      • 2020-08-07
      • 2018-01-07
      • 2021-11-18
      相关资源
      最近更新 更多