我有通知系统通过名为notification-refresh.php
的文件处理 AJAX 请求,该文件返回带有新通知的 JSON对象 - 如果存在。
因此,每个用户都会调用此文件将通知推送到浏览器。一切都很好,直到每个用户开始打开很多标签。每个标签请求3秒间隔内的文件。
请求数量过载服务器,我们暂时禁用了保存系统的功能。
那么,你们能帮助我吗?我不知道这是否可能,我只是寻找其他方法来通知系统仅使用 javascript 和 PHP ,但未成功。
有没有办法阻止用户在多个标签中运行相同的JavaScript调用?也许在隐藏标签中停止刷新......
PS:这不是服务器方面的问题。即使我们禁用了通知功能,也只是过载的微小请求数量。
你们所有人帮助了我很多,我找到了解决问题的快速解决方案。我会在这里留下代码,因为它可以在将来帮助人们(或不会)。
开始之前的事情:
canRefresh
的全局变量,负责允许或拒绝访问refresh()
函数; document.hasFocus()
,但如果您假装在代码的不同部分使用它,则建议使用它; 我无法向您展示整个代码,抱歉。
function check() {
if(document.hasFocus() == canRefresh)
return;
canRefresh = !canRefresh;
}
有效!再次感谢,伙计们!
答案 0 :(得分:1)
我会看看this post。
您也可能想要查看websockets。如果用户与服务器建立了websocket连接,并且已经存在,则应该断开套接字(或者将更新推送到所有套接字,无论如何。应该相当轻量级。)
答案 1 :(得分:1)
使用事件onfocus()
和onblur()
检查此标签是处于活动状态还是非活动状态。如果它处于活动状态(聚焦),则立即调用通知复习,否则停止向服务器调用请求。
var canCallRequest=true;
function refresh(){
if(!canCallRequest) return;
//request here...
};
window.onfocus = function () {
canCallRequest= true;
refresh();
};
window.onblur = function () {
canCallRequest = false;
};