Php 不同时间的双重AJAX请求

Php 不同时间的双重AJAX请求,php,javascript,ajax,Php,Javascript,Ajax,好的,我正在尝试制作一个AJAX聊天系统,它每400毫秒轮询一次聊天数据库。该部分正在工作,其中不工作的部分是活动用户列表。当我尝试组合这两个请求时,会发出前两个请求,然后整个过程都会滚雪球,并且通常定时(12秒)的活动用户列表请求开始每1ms更新一次,第一个请求再也不会发生。显示两个请求的整个AJAX代码: var waittime=400;chatmsg=document.getElementById("chatmsg"); room = document.getElementById("r

好的,我正在尝试制作一个AJAX聊天系统,它每400毫秒轮询一次聊天数据库。该部分正在工作,其中不工作的部分是活动用户列表。当我尝试组合这两个请求时,会发出前两个请求,然后整个过程都会滚雪球,并且通常定时(12秒)的活动用户列表请求开始每1ms更新一次,第一个请求再也不会发生。显示两个请求的整个AJAX代码:

var waittime=400;chatmsg=document.getElementById("chatmsg");
room = document.getElementById("roomid").value; 
chatmsg.focus()
document.getElementById("chatwindow").innerHTML = "loading...";
document.getElementById("userwindow").innerHTML = "Loading User List...";
var xmlhttp = false;
var xmlhttp2 = false;
var xmlhttp3 = false;
function ajax_read(url) {
if(window.XMLHttpRequest){
    xmlhttp=new XMLHttpRequest();
    if(xmlhttp.overrideMimeType){
        xmlhttp.overrideMimeType('text/xml');
    }
} else if(window.ActiveXObject){
    try{
        xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
        try{
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        } catch(e){
        }
    }
}
if(!xmlhttp) {
    alert('Giving up :( Cannot create an XMLHTTP instance');
    return false;
}
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState==4) {
    document.getElementById("chatwindow").innerHTML = xmlhttp.responseText;
    setTimeout("ajax_read('methods.php?method=r&room=" + room +"')", waittime);
    }
}
xmlhttp.open('GET',url,true);
xmlhttp.send(null);
}
function user_read(url) {
if(window.XMLHttpRequest){
    xmlhttp3=new XMLHttpRequest();
    if(xmlhttp3.overrideMimeType){
        xmlhttp3.overrideMimeType('text/xml');
    }
} else if(window.ActiveXObject){
    try{
        xmlhttp3=new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
        try{
            xmlhttp3=new ActiveXObject("Microsoft.XMLHTTP");
        } catch(e){
        }
    }
}
if(!xmlhttp3) {
    alert('Giving up :( Cannot create an XMLHTTP instance');
    return false;
}
xmlhttp3.onreadystatechange = function() {
if (xmlhttp3.readyState==4) {
    document.getElementById("userwindow").innerHTML = xmlhttp3.responseText;
    setTimeout("ajax_read('methods.php?method=u&room=" + room +"')", 12000);
    }
}
xmlhttp3.open('GET',url,true);
xmlhttp3.send(null);
}
function ajax_write(url){
if(window.XMLHttpRequest){
    xmlhttp2=new XMLHttpRequest();
    if(xmlhttp2.overrideMimeType){
        xmlhttp2.overrideMimeType('text/xml');
    }
} else if(window.ActiveXObject){
    try{
        xmlhttp2=new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
        try{
            xmlhttp2=new ActiveXObject("Microsoft.XMLHTTP");
        } catch(e){
        }
    }
}
if(!xmlhttp2) {
    alert('Giving up :( Cannot create an XMLHTTP instance');
    return false;
}
xmlhttp2.open('GET',url,true);
xmlhttp2.send(null);
}
function submit_msg(){
nick = document.getElementById("chatnick").value;
msg = document.getElementById("chatmsg").value;
document.getElementById("chatmsg").value = "";
ajax_write("methods.php?method=w&m=" + msg + "&n=" + nick + "&room=" + room + "");
}
function keyup(arg1) { 
if (arg1 == 13) submit_msg(); 
}
var intUpdate = setTimeout("ajax_read('methods.php')", waittime);
var intUpdate = setTimeout("user_read('methods.php')", waittime);

问题是在
user\u read
中设置了一个计时器,该计时器在12秒后以正确的URL运行
ajax\u read
。因此,当调用此
ajax\u read
时,它会获取信息并设置一个新的超时,这次在
waittime
之后调用
ajax\u read
,使用
?method=r..
。因此,在
user\u read
的第一次超时之后,它将不再被调用

仅供参考,我在本地web服务器上用Firebug和一个伪造的form and methods.php观看了这部电影。在将
waittime
设置为4000并使用
.innerHTML+=…
后,结果是每4秒调用两次

index.html
(我知道,它很快就脏了):


还要注意,
xmlhttp.status
可能不是
200

这几乎就像迷信,但我在并发XMLHttpRequests(特别是IE)方面运气不好是的,我宁愿不使用并发请求,但我不知道还有什么方法可以实现这一点。也许可以尝试使用不同的等待时间来抵消这两个请求?在
var waittime=400中使用逗号而不是分号;chatmsg=…
;现在,
chatmsg
是一个全局变量。其他全局变量也是如此(使用
var
)。有一个逗号,在一个点上有不同的等待时间,但它仍然像滚雪球一样。那么如何解决这个问题,我可以看到将user_read调用重命名为user_read(而不是ajax_read)是唯一的问题,这意味着这是它滚雪球的唯一原因?@Nik–当我更正该函数调用并将
waittime
返回到400时,使用本地web服务器似乎一切都正常。我不知道在现实世界中连接速度较慢、请求太多的情况下会发生什么,但我不想给我自己公司的服务器增加那么多负载。顺便说一句,我想你可以重新考虑一下你的代码:向
setTimeout
传递一个字符串而不是函数引用不是一个好主意(速度慢得多,而且基本上是不必要的),而且三次使用XMLHttpRequest代码也没有效率。@Marcel,我不太确定如何合并请求,我不明白你在哪里说我不应该传递字符串,因为对setTimeout的引用是一个函数(ajax_chat(url))。@Nik–只要在我的答案中创建文件,你就可以测试这个,例如使用。实际上,您正在向setTimeout传递字符串,例如,
“ajax\u read('methods.php?method=r&room=“+room+”)”
。函数引用不会被引号括起来:
setTimeout(ajax\u read,400)。这样,您就不能将参数传递给ajax\u read,所以您应该找到另一种实现所需的方法。这样效率更高。顺便说一句,您确实要检查发送到服务器的变量(如
msg
room
)是否不包含恶意代码,不是吗?是的,PHP文件会在收到每个变量时进行检查、转义和验证,如果发现任何不喜欢的内容,则终止请求。我是否将xmlhttp.open设置为包含字符串的url?
<!DOCTYPE html>
<html>
 <head>
  <meta charset=UTF-8>
  <title>Chat</title>
 </head>
 <body>
  <input id="chatnick" type="text" value="Nickname"><br>
  <input id="roomid" type="text" value="4"><br>
  <input id="chatmsg" type="text"><br>
  <div id="userwindow" style="width: 500px; height: 300px"></div><br>
  <div id="chatwindow" style="width: 300px; height: 300px"></div><br>
  <script src="js.js"></script>
 </body>
</html>
blah<br>