2011-06-21 126 views
3

我一直试图让这个长轮询脚本的工作,但我一直卡住。这一次,我对服务器的ajax请求有问题。提供数据的php脚本(使用循环和睡眠运行长轮询)工作得很好,但我的jQuery脚本没有。jQuery的AJAX PHP长轮询

到目前为止,我已经尝试使用正常的$.ajax()请求和$.post()请求到脚本,但是当我这样做时整个脚本停顿。好剧本实际上载入像它应该,但页面显示,它会持续(使用谷歌Chrome浏览器则显示“等待”在屏幕的底部栏)。在PHP脚本中60秒超时后,jQuery脚本收到“false”,因为没有找到数据。那么脚本应该要求提供数据。

我的问题是:我该如何避免这表明它加载的东西在后台浏览器?我的服务器是一个共享的服务器,所以我没有访问,当谈到服务器本身上安装的东西,所以这必须使用只有JavaScript(jQuery的)和PHP来解决。

编辑:刚才检查我的脚本出在Internet Explorer中,它似乎并没有展示任何迹象表明脚本加载,但它仍然在谷歌浏览

编辑问题发布一些代码:

这是我的JavaScript文件:

if($("#interestboard")) 
{ 
    var lasttime = $("#lasttime").val(); 
    var pollurl = $("#pollurl").val(); 
    lpStart(); 
} 
function lpStart() 
{ 
    $.ajax({ 
     type: "GET", 
     url: pollurl+lasttime, 
     async: true, 
     cache: false, 
     success:function(data) 
     { 
      alert(data); 
     }, 
     error: function() 
     { 
      alert("Something went wrong"); 
     } 
    }); 
} 

当然,这是内$(document).ready()

包裹

我的PHP脚本是类似以下内容:

while(time()-$time<60) 
    { 
     $this->class = $class["id"]; 
     $this->orderBy("timestamp"); 
     $this->_extraConditions = "`timestamp`>'$lastTime' AND "; 
     $result = $this->search(); 
     if($result) 
      return $result; 
     usleep(250000); 
     clearstatcache(); 
    } 

当使用萤火虫(谷歌浏览器),那只能说明一个请求已被提出,但没有显示在GET字符串的结尾通常加载图标在控制台。在Firefox中,它也只是表明一个请求正在挂起(显示加载图标),但至少浏览器不会像加载页面那样操作。

谢谢...

+0

你使用Firefox和萤火虫吗?这将有助于告诉你发生了什么事。你可以发布一些代码吗? – Brad

+0

刚刚编辑原始帖子,以便它包含源代码和使用Firebug的结果的简短说明 – Simon

+0

我现在已经开始工作了。如果我设置一个超时来调用lpStart()函数,在加载DOM后两秒,Google Chrome将不会显示加载栏,但是这带来了一个新问题。每当我停止请求(即通过单击一个链接),错误事件就会被触发,并且我收到一条警告,告诉我“出错了”(就像它应该的那样)。在此之后,该网站将不会加载,直到请求缩短时间已到达。这只会发生,如果我在同一浏览器(同一会话) - 而不是当我的电脑出现错误,然后加载页面上我iPad ... – Simon

回答

3

我想你应该在Chrome AJAX on page-load causes "busy cursor" to remain阅读最高的评论 - 现在看来,这是谷歌浏览器的具体和你需要等待之前的所有内容调用Ajax之前加载。

编辑:只是一个建议 - 莫比我错了:你不应该使用GET请求来确保网站上的任何巨大的/敏感的操作,因为它可能会导致您的网站和容易攻击。任何拥有/侵入一些高负载网站的人都可以在页面中插入一个不可见的iframe,这样任何访问该页面的用户都可以在没有意识到的情况下发出GET请求 - 它会崩溃/损害您的服务器(因为成千上万的请求发送给您服务器)。大多数现代浏览器不会允许跨站点POST请求,所以它应该是安全的。

编辑2:关于你的网站是unavaliable,而你甚至中止后,该脚本仍在工作:这是因为会议的可能性最大。标准会话行为只允许一个具有相同会话的php实例在同一时刻运行 - 所有其他请求都会一直等到该会话在所有其他脚本中关闭。您应该尽快在脚本中使用close the session,使用自定义会话处理来启用同一会话中的多个请求(最有可能这将非常难看)或者detect user abort用于在用户在浏览器中中止后立即关闭该页面。

+0

我已经尝试检测用户中止之前,但我读了一些关于会话存储目录权限的东西,不会允许php脚本检测用户中止,当它是一个ajax调用脚本..唯一的是我没有改变默认会话存储目录..你知道我是如何检测用户在php中的中止,当它是一个Ajax调用? – Simon

+0

我现在正在工作..你提到的两件事的组合。我在while循环之前添加了'session_write_close();'然后将if(connection_aborted)break;'添加到while循环的末尾。通过这种方式,它可以检测到脚本的堕胎,一切正常,因为它应该:-) – Simon

+0

我很高兴我能帮上忙。但是你得到了有关AJAX调用错误的信息:Web服务器无法检测到用户是使用AJAX调用还是只是一个页面请求(有时它可以,但不是很可靠):它们都是简单的HTTP请求(你甚至可以看在萤火虫的请求和比较它们)。 AJAX并不是一些新技术 - 它已经使用了很长时间(使用iframe),我们通过XMLHttpRequest对象(或模拟)获得的唯一新东西可以更好地控制此请求中正在发生的事情。 – XzKto