有没有办法让使用服务器发送的事件持久化?
我需要运行一个脚本,每秒更新一次用户的浏览器。 我的需求是从服务器到客户端的单向通信。
为此,我实现了从服务器轮询到用户客户端的服务器发送事件 。
问题是用户允许打开与服务器的多个连接“通过打开多个浏览器选项卡”这是一个问题,因为它增加了服务器上的开销。
我想将来自单个用户的连接限制为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会话。
当您使用PHP会话时,PHP脚本会锁定它。 这意味着没有其他脚本可以访问会话。 在你的情况下,这就是你想要的。 (在最近的另一个问题中, 服务器发送事件轮询导致长时间延迟 ,这是导致问题的原因。)
如果您要求他们登录会话以便能够使用它,那就更好了。 (否则禁用cookie的人仍然可以访问多个选项卡。)
问题是他们的其他标签只是坐在那里,并且(我相信)PHP进程正在耗尽服务器上的资源,而它等待会话解锁。
您可以通过使用会话变量记录它们具有当前连接并确保释放会话锁定来解决该资源使用问题(如另一个问题中所述)。 然后,当用户尝试连接多次时,您可以向用户提供友好的错误消息。
在代理/防火墙级别:将规则设置为不允许同一个内容一次具有多个连接到同一URL(在本例中为您的SSE脚本)。 向他们重定向一个错误页面,解释他们不被允许的原因。
这个东西的明显但不好的选择是他们的IP地址。 这很糟糕,因为多个用户可能来自同一个IP地址。 您可以使用他们的用户代理,但同样不可靠。 给他们一个cookie,并寻找它更好。 (你甚至可以查找PHP会话cookie。)