jquery $ .ajax请求仍然未决

时间:2012-01-04 09:42:00

标签: php ajax jquery long-polling

我制作了一个简单的聊天应用程序,它使用了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请求仍然未决。表示发送消息请求仍处于待处理状态。

2 个答案:

答案 0 :(得分:4)

问题是由于会话锁定;

send.phplisten.php个文件都使用会话变量, 因此,会话在listen.php文件中被锁定,并且在会话释放服务于另一个文件(此处为send.php)之后,无法提供其他文件(此处为listen.php文件)。

答案 1 :(得分:1)

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,那里已经制作了大量的脚本并进行了微调并且已经进行了测试,修复了错误并且许多人都帮助构建了它,我的建议是不要重新发明轮子< / p>