我需要运行一个每秒更新一次用户浏览器的脚本。我的需求是从服务器到客户端的单向通信。
为此,我将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();
};
有没有办法让这种沟通方法持久?
答案 0 :(得分:1)
(这是一个间接的答案:如何防止打开多个标签的开销。如果所有标签都需要提供数据,那么您需要在标签之间使用一些通信方法,并且共享工作者的想法看起来不错为此。)
在应用程序级别:使用PHP会话。
当您使用PHP会话时,PHP脚本会锁定它。这意味着没有其他脚本可以访问会话。在你的情况下,这就是你想要的。 (在最近的另一个问题Server-Sent Events Polling causing long delays中,这是导致问题的原因。)
如果您要求他们登录会话以便能够使用它,那就更好了。 (否则,禁用cookie的人仍然可以访问多个选项卡。)
问题是他们的其他标签只是坐在那里,并且(我相信)PHP进程正在耗尽服务器上的资源,而等待会话解锁。
您可以通过使用会话变量记录它们具有当前连接并确保释放会话锁定(如另一个问题中所述)来解决该资源使用问题。然后,当用户尝试连接多次时,您可以向用户提供友好的错误消息。
在代理/防火墙级别:将规则设置为不允许相同的某些一次具有多个连接到同一个URL(您的SSE脚本)在这种情况下)。向他们重定向一个错误页面,解释为什么不允许这样做。
某事的明显但不好的选择是他们的IP地址。这很糟糕,因为多个用户可能来自同一个IP地址。您可以使用他们的用户代理,但同样不可靠。给他们一个cookie,并寻找它更好。 (您甚至可以查找PHP会话cookie。)