3

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

到目前为止,我已经尝试使用普通$.ajax()请求和$.post()对脚本的请求,但是当我这样做时,整个脚本都会停止。好吧,脚本实际上按预期加载,但页面显示它一直在加载(使用谷歌浏览器它在屏幕底部显示“等待”栏)。在 php 脚本中的 60 秒超时后,jQuery 脚本收到“false”,因为没有找到数据。然后该脚本应该要求提供数据。

我的问题是:如何避免浏览器显示它正在后台加载某些内容?我的服务器是共享服务器,因此在服务器本身上安装东西时我无权访问,因此只能使用 javascript (jQuery) 和 php 来解决。

编辑:刚刚在 Internet Explorer 中检查了我的脚本,它似乎没有显示脚本正在加载的任何迹象,但它在 Google 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();
    }

当使用萤火虫(使用谷歌浏览器)时,它只显示一个请求已经发出,但在控制台的 GET 字符串的末尾没有显示通常的加载图标。在 Firefox 中,它也只是显示一个请求正在等待(显示加载图标),但至少浏览器不像页面正在加载一样。

谢谢...

4

1 回答 1

3

我认为您应该阅读有关Chrome AJAX 页面加载导致“忙碌光标”保留的顶级评论- 它似乎是 Google Chrome 特定的,您需要在加载所有内容之前等待,然后再进行 ajax 调用。

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

编辑 2:关于您的网站不可用,而该脚本即使在您中止它后仍在工作:这很可能是因为会话。标准会话行为将只允许一个具有相同会话的 php 实例同时运行 - 所有其他请求将等到该会话在所有其他脚本中关闭。您应该尽快在脚本中关闭会话,使用自定义会话处理来启用具有相同会话的多个请求(很可能这将非常难看)或检测用户中止以在用户在浏览器中中止它时立即关闭脚本。

于 2011-06-22T08:09:17.890 回答