我试图通过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下检查时,没有请求正在发生或正在进行但是我知道他们也在使用定期刷新...他们是如何做到的?
答案 0 :(得分:3)
我用萤火虫运行开着facebook打开,我每分钟都会看到一次请求,这对我来说似乎很充实。
Comet使用的另一种方法是发出请求并保持打开状态,服务器将数据运送到客户端而不完成响应。这是一个黑客攻击,违反了HTTP的所有原则:)。但它确实有效。
答案 1 :(得分:2)
您可以每10秒检查一次新数据,但不需要检查数据库,而是需要进行较低的影响检查。
我要做的是修改数据库更新过程,以便在对某些数据进行更改时,还会更新文件的时间戳,以显示最近的更改。
如果你想要更好的粒度而不是“在db中某处改变某些东西”,你可以通过用户名(或其他一些标识符)将其分解。然后,要更新的文件将是可能对更新感兴趣的每个用户的用户名。
因此,当脚本询问服务器是否有比时间t更新的用户X的任何信息,而不是进行数据库查询时,服务器端脚本只能比较文件的时间戳和时间参数,看看是否数据库中有新的东西。
在更新数据库的过程中,添加(粗略地)执行的代码:
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);
}
一旦您发现有新数据,您就可以进行全面的数据库查询并获取所需的任何信息。
答案 2 :(得分:0)
这是非常不可靠的,并且在大多数情况下可能在服务器上过于沉重。
也许你应该看一下推送界面:http://en.wikipedia.org/wiki/Push_technology
我听说Comet是最具扩展性的解决方案。
答案 3 :(得分:0)
我怀疑Facebook使用Flash电影(他们总是下载一个名为SoundPlayerHater.swf的电影),他们用这些电影与服务器进行通信。这不会被Firebug捕获(尽管可能是Fiddler)。
答案 4 :(得分:0)
这不是更好的方法。因为您最终每10秒查询一次服务器,即使没有真正的更新。
您可以模拟服务器推送(reverrse AJAX或COMET)方法,而不是此轮询方法。这将完全减少服务器工作负载,如果服务器端有更新,则只更新客户端。
根据维基百科
反向Ajax是指Ajax设计 使用长期HTTP的模式 连接以实现低延迟 Web服务器和Web服务器之间的通信 一个浏览器。基本上它是一种方式 从客户端向服务器发送数据 推送服务器数据的机制 回到浏览器。
有关详细信息,请查看我对similar question
的其他回复