Javascript AJAX请求成功3次,然后失败
我正在使用以下脚本将即时消息异步提交到我的数据库Javascript AJAX请求成功3次,然后失败,javascript,php,jquery,ajax,Javascript,Php,Jquery,Ajax,我正在使用以下脚本将即时消息异步提交到我的数据库 function sendMessage(content, thread_id, ghost_id) { var url = "ajax_submit_message.php"; var data = { content: content, thread_id: thread_id }; var type= "POST"; $.ajax({ url:url, type:type,
function sendMessage(content, thread_id, ghost_id)
{
var url = "ajax_submit_message.php";
var data = { content: content, thread_id: thread_id };
var type= "POST";
$.ajax({
url:url,
type:type,
data:data,
success:function(){ unGhost(ghost_id); refreshMessages(); },
error:function(){alert("FAIL");}
});
}
这与正常情况下的预期完全一样,但当我在PHP脚本中添加了一个“sleep(10)”,试图了解它在服务器负载过重的情况下如何工作时,我发现该脚本在中止之前只能处理几个请求
脚本将完成三个成功的请求,但在第四个请求中,每次都会失败。它不调用error函数,而是调用success函数。我不知道如何调试它,因为没有任何类型的错误或异常被抛出。有人能告诉我是什么引起的吗
编辑:由于请求,以下是我调用函数的方式:
function checkKey(e)
{
if (e.keyCode == 13)
{
//Get message and thread_id
var message_field = $(':focus');
//Validate and escape content
var content = message_field.val();
if (content == "") {return;}
//Grab thread_id
var id = message_field.attr('id');
var last_underscore = id.lastIndexOf("_");
var thread_id = id.substring(last_underscore+1);
//Clear input
message_field.val("");
//Add message to page
var ghost = insertGhost(thread_id,content,window.user_id);
//Send message on to server
sendMessage(content,thread_id,ghost);
}
}
如果您定期轮询(而不是在每次操作后手动将轮询排队),则可能会遇到超时行为。也许第四个不是失败,实际上第四个是成功,第五个是默默地失败 原因如下:浏览器一次最多允许向给定主机发出2个并发请求。任何附加请求都将放入对应用程序透明的队列中。但是,这些AJAX请求超时。所以前两个是好的。接下来的两个需要等待一段时间,但它们在超时应用之前被发送和接收。随后的事件已添加到浏览器的队列中,但由于它们在发送之前就超时,因此您看不到任何活动
您可以通过确保在成功/失败时执行setTimeout来测试这一点,或者通过其他方法来管理您在任何给定时间有多少个挂起的请求经过一番探索后,我发现我的PHP脚本实际上超时了,并响应以下消息: 超过了30秒的最长执行时间 这是有道理的,因为这是我测试的对象。我发现捕获此错误的唯一方法是在成功时将我的PHP脚本输出为“TRUE”,并按如下方式格式化我的AJAX脚本:
$.ajax({
url:url,
type:type,
data:data,
success:function(msg)
{
if ($.trim(msg) != "TRUE")
{
//graceful error handling magic
}
unGhost(ghost_id);
refreshMessages();
},
error:function(){alert("FAIL");}
});
这不是我做过的最优雅的事情,但它应该允许我适应服务器过载的情况
谢谢你们的帮助 如果它调用了success函数,则服务器必须已响应成功状态代码。如何调用sendMessage函数?使用
console.log()
调试代码,并在此处发布错误消息sleep(10)
确实是个坏主意。.制作多线程Web服务器有什么问题?很快就被接受了!我猜你在我发布之前就已经发现了答案?是的。我张贴了我自己的答案,但你的答案是死板的,所以我接受了。谢谢所以说得很清楚,我可能会在服务器端或客户端遇到超时?是的,它们是单独的超时条件。我的回答是关于浏览器端超时。您的问题似乎是PHP超时(睡眠(10)并没有完全解释这一点,因此您可能会遇到一些服务器端代码问题),我不知道在PHP中多个并发请求在有线程/无线程的情况下是如何工作的。但是,除非您使用多个客户端或多个主机名进行测试,否则由于上述并发请求限制,您的服务器在任何时候都不应该有3个并发请求