我有一个简单的社交网站,有聊天功能。我在多个页面中经常使用$.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'];
?>
我在墙上用力打了一个星期。所以,请帮我解决这个问题。提前致谢。对不起我的蹩脚英语。
由于您似乎需要自动完成类型设置,请使用计时器。在每次按键时重置它,并在延迟发送你的帖子后。在此示例中,它将在最后一次按键后发送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请求正在进行时禁用密钥处理程序。
最简单的答案是,您允许您的服务器被垃圾邮件发送到它停止响应(但仍然收到新连接)。如果连接没有及时关闭(解决),你也会遇到对域的并发浏览器连接的限制(我认为这确实发生了 - 浏览器阻止你做出这些请求)。
您可以切换到套接字,也可以按设定的时间间隔将文本发送到服务器。或者你不允许下一篇文章,直到之前的决定。
您可以在第一个帖子之前删除处理程序,并在帖子返回时再次将其设置回来,而不是允许您的服务器被垃圾邮件。
$(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;
});
}
});
这很好。
var waiting=false;
$(".abc").keyup(function(){
if(!waiting){
waiting = true;
// code
$.post('bbs.php',{a:a},function(abc){
$(".showoff").html(abc);
waiting=false;
});
}
});