- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要运行一个每秒更新一次用户浏览器的脚本。我的需要是从服务器到客户端的单向通信。
为此,我实现了 server-sent events从我的服务器轮询到用户的客户端。
问题是允许用户“通过打开多个浏览器选项卡”打开与服务器的多个连接,这是一个问题,因为它增加了服务器的开销。
我想将来自单个用户的连接限制为 1。这意味着跨所有选项卡与服务器的单个连接。即使用户打开了 10 个浏览器选项卡,客户端和服务器之间也只有一个连接。
这是我的服务器发送事件实现
var evtSource = new EventSource('getMyMessages.php');
evtSource.addEventListener("getMessagingQueue", function(e) {
console.log(e);
var data = JSON.parse(e.data);
processServerData(data);
}, false);
evtSource.onerror = function(e) {
evtSource.close();
};
有没有办法让这种通信方法持久化?
最佳答案
(这是一个间接答案:如何防止打开多个选项卡的开销。如果需要向所有选项卡提供数据,那么您将需要选项卡之间的某种通信方法,并且共享工作人员的想法看起来很适合这一点.)
在应用程序级别:使用 PHP session 。
当您使用 PHP session 时,PHP 脚本会锁定它。这意味着没有其他脚本可以访问该 session 。就你而言,这就是你想要的。 (在最近的另一个问题 Server-Sent Events Polling causing long delays 中,这是问题的原因。)
如果您要求他们登录 session 才能使用它,那就更好了。 (否则禁用 cookie 的人仍然可以访问多个选项卡。)
问题是他们的其他选项卡只是坐在那里,并且(我相信)PHP 进程在等待 session 解锁时正在耗尽服务器上的资源。
您可以通过使用 session 变量来记录它们具有当前连接,并确保释放 session 锁(如另一个问题中所述)来解决该资源使用问题。然后,当用户尝试多次连接时,您可以向用户提供友好的错误消息。
在代理/防火墙级别:设置一条规则,不允许同一某物一次对同一 URL(您的 SSE 脚本)有多个连接在这种情况下)。将错误页面重定向给他们,解释为什么不允许他们这样做。
对于某物来说,显而易见但不好的选择是它们的IP地址。这很糟糕,因为多个用户可能来自同一个 IP 地址。您可以使用他们的用户代理,但同样不可靠。给他们一 block cookies ,然后寻找它会更好。 (您甚至可以查找 PHP session cookie。)
关于javascript - 有没有办法让使用服务器发送的事件持久化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31143150/
我是一名优秀的程序员,十分优秀!