我试图通过XMLHttp(XHR)在我的网站上使用定期刷新(ajax)/轮询来检查用户是否每隔10秒在数据库中有一条新消息,然后是否通过动态创建div来通知他/她,例如这个:

function shownotice() {
    var divnotice = document.createElement("div");
    var closelink = document.createElement("a");
    closelink.onclick = this.close;
    closelink.href = "#";
    closelink.className = "close";
    closelink.appendChild(document.createTextNode("close"));
    divnotice.appendChild(closelink);
    divnotice.className = "notifier";
    divnotice.setAttribute("align", "center");
    document.body.appendChild(divnotice);
    divnotice.style.top = document.body.scrollTop + "px";
    divnotice.style.left = document.body.scrollLeft + "px";
    divnotice.style.display = "block";
   request(divnotice);
}


这是一种可靠或稳定的检查消息的方法,特别是因为当我查看Firebug时,我的数据库正在进行大量请求吗?这种方法是否可以因为请求过多而使数据库崩溃?还有另一种方法可以执行此操作,因为当我登录Facebook并在Firebug下检查时,没有任何请求在发生或继续,但是我知道他们也在使用定期刷新...他们如何做到这一点?

最佳答案

您可以每10秒检查一次新数据,但是您需要进行一次较低的影响检查,而不是检查数据库。

我要做的是修改db更新过程,以便在对某些数据进行更改时,它还更新文件上的时间戳以显示最近的更改。

如果您想获得比“数据库中某处发生的更改”更好的粒度,可以按用户名(或其他一些标识符)将其细分。然后,要更新的文件将是每个可能对更新感兴趣的用户的用户名。

因此,当您脚本询问服务器X是否有关于用户X的信息比时间t更新时,而不是进行数据库查询,服务器端脚本可以将文件的时间戳与time参数进行比较,看看是否有任何信息。数据库中的新内容。

在更新数据库的过程中,添加(大致)执行的代码:

foreach username interested in this update
{
    touch the file \updates\username
}


然后,用于查看是否有新数据的函数如下所示:

function NewDataForUser (string username, time t)
{
     timestamp ts = GetLastUpdateTime("\updates\username");
     return (ts > t);
}


一旦发现新数据,就可以执行完整的数据库查询,并获取所需的任何信息。

关于javascript - 定期刷新或轮询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1682175/

10-16 10:45