Javascript 在$.POST上获取ERR\u EMPTY\u响应
我有一个简单的带有聊天功能的社交网站。我在多个页面中使用了Javascript 在$.POST上获取ERR\u EMPTY\u响应,javascript,php,jquery,ajax,Javascript,Php,Jquery,Ajax,我有一个简单的带有聊天功能的社交网站。我在多个页面中使用了$。post很多。 该代码在除message.php之外的所有页面上都运行良好,在message.php中,用户消息被多次发布和获取 $.post (用于在本地服务器上正常工作) 当用户之间的消息模拟发生时,网站停止响应。重新加载时,服务器停机,并显示ERR_EMPTY_响应消息。几分钟后,该网站再次投入运行。据我所知,这发生在经常使用$.post的页面上 为了总结这种情况,我创建了一个当连续输入几秒钟时,就会出现一个ERR\u EMPT
$。post
很多。
该代码在除message.php之外的所有页面上都运行良好,在message.php中,用户消息被多次发布和获取
$.post
(用于在本地服务器上正常工作)
当用户之间的消息模拟发生时,网站停止响应。重新加载时,服务器停机,并显示ERR_EMPTY_响应消息。几分钟后,该网站再次投入运行。据我所知,这发生在经常使用$.post的页面上
为了总结这种情况,我创建了一个当连续输入几秒钟时,就会出现一个ERR\u EMPTY\u响应。
页面内容:
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>
$(文档).ready(函数(e){
$(“.abc”).keyup(函数(){
var a=$(this.val();
$(“.shooff”).text(“等待…”;
$.post('bbs.php',{a:a},函数(abc){
$(“.shooff”).html(abc);
});
});});
打字来改变我!
bbs.php<?php
echo $_POST['a'];
?>
一个星期以来,我的头一直撞在墙上。所以,请帮我解决这个问题。
提前谢谢。
对不起,我的英语也很蹩脚。最简单的答案是你允许你的服务器被垃圾邮件发送到停止响应的程度(但仍然接收新的连接)。如果没有及时关闭(解决)连接,您也会遇到并发浏览器连接到域的限制(我认为这确实发生了-浏览器阻止您发出这些请求)
您可以切换到套接字,或者按照设置的时间间隔向服务器发送文本。或者,在解决上一篇文章之前,您不允许下一篇文章。您可以在第一篇文章之前删除处理程序,并在文章返回时将其重新设置
$(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 syncronous:使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;
});
}
});
由于您似乎需要自动完成类型设置,请使用计时器。在每次按键时将其重置,并在延迟后发送您的帖子。在本例中,它将在最后一次按键后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:
这将避免服务器过载,因为每3秒来自同一用户的请求不超过1个。如果响应速度低于3秒,则可能还需要在Ajax请求进行过程中禁用密钥处理程序。这很好
var waiting=false;
$(".abc").keyup(function(){
if(!waiting){
waiting = true;
// code
$.post('bbs.php',{a:a},function(abc){
$(".showoff").html(abc);
waiting=false;
});
}
});
谢谢你的回答。你能用一个简单的例子来详细说明吗?TrueBlueAustie的例子已经足够好了——在客户端解决了这个问题;]嗨,刚刚检查了我服务器上的代码。这有点帮助,但服务器仍处于关闭状态。是不是服务器无法处理大约10个请求?嗨,谢谢。代码似乎有效。我已将时间缩短到1秒。如果50个用户同时请求,服务器是否会停机?取决于服务器。我认为问题通常是来自同一用户的请求数量。您每分钟最多发送60个请求,有些请求可能会重叠。最好在另一个Ajax请求正在进行时重置时间,不要同时发送另一个请求:)永远不要建议将
async:false
作为解决方案。。。什么都可以!这是一扇亮闪闪的门,通向非常黑暗的地方。始终使用浏览器的异步模型,否则在处理请求时会锁定浏览器。在这种情况下,它几乎会永久锁定它(在每次按键时)。你的第二个选择更好。