jQuery ajax php长轮询

时间:2011-06-21 23:52:03

标签: php jquery long-polling server-push

我一直试图让这个长的民意调查脚本工作,但我一直陷入困境。这次我对服务器的ajax请求有问题。提供数据的php脚本(使用循环和睡眠运行长轮询)完全正常,但我的jQuery脚本没有。

到目前为止,我已尝试对脚本使用正常的$.ajax()请求和$.post()请求,但是当我这样做时,整个脚本都会停止。好吧,脚本实际上加载了它应该,但页面显示它继续加载(使用谷歌浏览器它显示屏幕底部的“等待”栏)。在PHP脚本中60秒超时后,jQuery脚本收到“false”,因为没有找到数据。然后该脚本应该询问数据agian。

我的问题是:如何避免浏览器显示它在后台加载某些内容?我的服务器是一个共享服务器,因此我无法访问服务器本身的安装内容,因此必须使用javascript(jQuery)和php来解决。

编辑:刚刚在Internet Explorer中检查了我的脚本,它似乎没有显示脚本正在加载的任何迹象,但它仍然是谷歌Chrome中的一个问题

编辑发布一些代码:

这是我的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();
    }

使用firebug(使用Google Chrome)时,它只会显示已发出请求,但未在控制台的GET字符串末尾显示通常的加载图标。在Firefox中它还显示一个请求处于挂起状态(显示加载图标),但至少浏览器不像页面正在加载一样。

...谢谢

1 个答案:

答案 0 :(得分:3)

我认为您应该阅读Chrome AJAX on page-load causes "busy cursor" to remain上的热门评论 - 它似乎是特定于Google Chrome的,您需要等待所有内容加载才能进行ajax调用。

编辑:只是推荐 - maby我错了:您不应该使用GET请求在您的网站上进行任何大型/敏感操作,因为它可能会导致您的网站轻松攻击。拥有/攻击某些高负载网站的任何人都可以在其网页中插入一个不可见的iframe,以便访问该网页的任何用户都可以在没有意识到的情况下发出该GET请求 - 它可能会导致服务器崩溃/损坏(因为有数千个请求来到您的网站)服务器)。大多数现代浏览器都不会允许跨站点POST请求,因此它应该是安全的。

编辑2:关于您的网站无法使用,而该脚本即使在您中止后仍然有效:这很可能是因为会话。标准会话行为将只允许一个具有相同会话的php实例同时运行 - 所有其他请求将等待,直到该会话在所有其他脚本中关闭。你应该在脚本中尽快close the session,使用自定义会话处理来启用具有相同会话的多个请求(很可能这将非常难看)或detect user abort一旦用户中止它就关闭sript浏览器。