Php jquery$.ajax请求仍处于挂起状态

Php jquery$.ajax请求仍处于挂起状态,php,ajax,jquery,long-polling,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 co

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

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

它不必位于数据库中,也可以保存在tmp文件中,但您的问题是执行太多请求会阻塞浏览器,任何一个浏览器一次处理两个请求,这意味着您应该允许浏览器先完成第一个请求,然后再执行第二个请求。。。等等

您不需要执行
send.php
listen.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,那么有大量的脚本已经制作好,经过了微调,并且已经过测试,bug已经修复,许多人都在帮助构建它,我的建议是不要重新发明轮子

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

它不必位于数据库中,也可以保存在tmp文件中,但您的问题是执行太多请求会阻塞浏览器,任何一个浏览器一次处理两个请求,这意味着您应该允许浏览器先完成第一个请求,然后再执行第二个请求。。。等等

您不需要执行
send.php
listen.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,有大量的脚本已经制作好,经过了微调,已经过测试,bug已经修复,许多人帮助构建了它,我的建议是不要重新发明轮子,问题是因为会话锁定

send.php
listen.php
文件都使用会话变量,
因此会话被锁定在
listen.php
文件中,而另一个文件(此处
send.php
文件)在会话从服务另一个文件(此处
listen.php
)中释放后无法服务

send.php
listen.php
文件都使用会话变量,
因此,会话被锁定在
listen.php
文件中,而另一个文件(此处
send.php
文件)在会话从服务另一个文件(此处
listen.php
)中释放后无法提供服务。

代码在哪里?我还想看看PHP代码或它的一部分,你能添加一些代码吗?我已经编辑了这个问题,可能是firebug,尝试更新到firebug的新版本,这不是firebug,因为在chatbox中输入消息后,该消息的条目应该保存在数据库中。数据库中不存在。代码在哪里?我还想看看PHP代码或它的一部分,你能添加一些代码吗?我已经编辑了这个问题,可能是firebug,尝试更新到firebug的新版本,这不是firebug,因为在chatbox中输入消息后,该消息的条目应该保存在数据库中。而且它不存在于数据库中。他们有任何方法可以同时发出并行请求吗?正如我在上面解释的,你不必这样做,但要研究管道或其他东西来扩展管道请求,但我想让聊天尽可能轻松和快速,所以请给出你的建议:不要再发明轮子,有没有哪种轻量级且尽可能基本的长轮询框架可用于共享主机?它们是否可以同时发出并行请求?正如我上面解释的,您不必这样做,但是看看管道或其他东西来扩展管道请求,但是我想让聊天尽可能地轻巧和快速,所以代表你的建议:不要再发明轮子,有没有那种轻巧和尽可能基本的框架存在,可以用于共享主机的长时间轮询?