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个并发请求