【问题标题】:jquery $.ajax request remains pendingjquery $.ajax 请求仍然挂起
【发布时间】:2012-02-02 05:29:37
【问题描述】:

我制作了一个简单的聊天应用程序,它使用 jquery 的长轮询方法,

function sendchat(){ 
// this code sends the message
$.ajax({
  url: "send.php",
  async: true,
  data: { /* send inputbox1.value */ },
  success: function(data) { }
    });
}

function listen_for_message(){ 
// this code listens for message
$.ajax({
  url: "listen.php",
  async: true,
  timeout:5000,
  success: function(data) { // the message recievend so display that message and make new request for listening new messages 
            $('#display').html(data);
            listen_for_message();
             }
    });
}

这应该发生:在页面加载后发生对listen.php的无限请求并且当用户发送消息时,代码通过send.php将消息发送到数据库。

问题是,使用firebug 我发现在listen.php 请求之后执行的send.php 请求仍然处于未决状态。表示发送消息的请求仍在等待中。

【问题讨论】:

  • 代码在哪里?我还想看看 PHP 代码或其中的一部分
  • 你能添加一些代码吗?
  • 我已经编辑了问题
  • 可能是萤火虫错误尝试更新到较新版本的萤火虫
  • 我认为这不是萤火虫错误,因为在聊天框中输入消息后,该消息的条目应保存在数据库中。并且在数据库中不存在。

标签: php ajax jquery long-polling


【解决方案1】:

问题是由于会话锁定

send.phplisten.php 文件都使用会话变量, 所以会话被锁定在listen.php 文件中,并且在会话从提供另一个文件(这里是listen.php)之后,另一个文件(这里是send.php 文件)不能被提供。

【讨论】:

    【解决方案2】:

    How do I implement basic "Long Polling"?

    上面的链接是一个类似的问题,可能会对您有所帮助。

    它不必在数据库中,它可以保存在 tmp 文件中,但是您的问题是您通过执行太多请求而阻塞了浏览器,任何一个浏览器一次处理两个请求,这意味着您真的应该让浏览器先完成第一个请求,然后再执行第二个请求……依此类推……

    你不需要做send.phplisten.php,因为你可以在一个页面上完成。

    function check(){
    $.ajax({
      url  : 'process.php',
      data : {msg:'blabla'/* add data here to post e.g inputbox1.value or serialised data */}
      type : 'post',
      success: function (r){
        if(r.message){
           $('#result').append(r.message);
           check();//can use a setTimeout here if you wish
        }
      }
    });
    }
    

    process.php

    <?php 
    
    $msg = $_POST['msg'];//is blabla in this case.
    $arg['message'] = $msg;//or grab from db or file
    //obviously you will have to put it on a database or on a file ... your choice
    //so you can differentiate who sent what to whom.
    echo json_encode($arg);
    
    ?>
    

    显然,这只是指导方针,但使用此方法会耗尽带宽,但会好很多,因为只有一个小文件返回 0 到 1 字节的信息,如果有消息则返回更多信息已发布。

    我尚未对此进行测试,因此不要依赖它立即工作,您需要进行一些更改才能使其工作,但只是帮助您了解应该如何做。

    但是,如果您正在寻找长期拉动 ajax,那么已经有大量脚本已经制作和微调,并且已经过测试、修复错误并且许多人帮助构建它,我的建议是不要重新发明轮子

    【讨论】:

    • 他们有什么办法同时发出并行请求吗?
    • 正如我在上面解释的那样,您不必这样做,但请查看管道或其他扩展管道请求的东西
    • 但我想让聊天尽可能轻松和快速,所以代表您的建议:不要重新发明轮子,有没有那种轻量级和基本的是否存在可用于共享主机的长轮询框架?
    猜你喜欢
    • 2019-05-21
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2014-01-30
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    相关资源
    最近更新 更多