在$ .POST上获取ERR_EMPTY_RESPONSE

我有一个简单的社交网站,有聊天function。 我在多个页面中经常使用$.post 。 该代码适用于除message.php之外的所有页面,其中用$.post发布和多次提取用户消息(用于在本地服务器上运行良好)。

当用户之间的消息传递模拟时,网站停止响应。 在重新加载时,服务器关闭并显示ERR_EMPTY_RESPONSE消息。 该网站在几分钟后再次投入使用。 据我所知,这种情况发生在经常使用$ .post的页面上。

总结一下情况,我创建了一个实时测试页面 。 当输入连续几秒钟时,会发生ERR_EMPTY_RESPONSE
页面内容:

a.php只会

  $(document).ready(function(e) { $(".abc").keyup(function(){ var a = $(this).val(); $(".showoff").text("wait.."); $.post('bbs.php',{a:a},function(abc){ $(".showoff").html(abc); }); });});   
Type to Change Me!

bbs.php

  

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

由于您似乎需要自动完成类型设置,请使用计时器。 在每个按键上重置它,并在延迟发送您的post后。 在此示例中,它将在最后一次按键后发送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请求正在进行时禁用密钥处理程序。

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

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

您可以在第一个post之前删除处理程序,并在post返回时再次将其设置回来,而不是允许您的服务器被垃圾邮件。

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