我正在使用以下脚本将即时消息异步提交到我的数据库。
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)'以试图找出它在繁重的服务器负载下如何工作时,我发现该脚本只能处理一个在它中止之前几乎没有请求。
该脚本将完成三个成功的请求,但在第四个上它将每次都失败。它不会调用错误函数,而是调用成功函数。我不知道如何调试它,因为在任何地方都没有抛出任何类型的错误或异常。谁能告诉我可能是什么造成的?
编辑:由于请求,这里是我如何调用该函数:
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);
}
}
答案 0 :(得分:3)
如果您定期轮询(而不是在每次操作后手动排队轮询),您可能会遇到超时行为。可能第四个没有失败,实际上第四个是成功的,第五个是默默地失败。
原因如下:浏览器一次最多允许两个并发请求到给定主机。任何其他请求都将放入对您的应用程序透明的队列中。但是,这些AJAX请求超时。所以前两个都很好。接下来的两个必须等待一段时间,但是在超时适用之前它们会被发送和接收。后续版本已添加到浏览器的队列中,但由于它们在发送之前超时,因此您看不到任何活动。
你可以通过确保在成功/失败时执行setTimeout来测试这一点,或者通过其他一些方法来管理你在任何时候有多少未决请求
答案 1 :(得分:0)
经过一番探索之后,我发现我的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");}
});
不是我做过的最优雅的事情,但它应该允许我适应服务器过载的情况。
感谢帮助人员!