我试图通过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/