gpt4 book ai didi

javascript - 有没有办法让使用服务器发送的事件持久化?

转载 作者:行者123 更新时间:2023-11-28 00:08:18 25 4
gpt4 key购买 nike

我需要运行一个每秒更新一次用户浏览器的脚本。我的需要是从服务器到客户端的单向通信。

为此,我实现了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com