用EventSource获取User的在线状态靠谱吗?

Is it reliable to use EventSource to get User's online status?

我使用了 EventSource 方法来获取我网站上活跃用户的在线状态。 在下面的JavaScript代码中,每个页面都插入了

var source = new EventSource("set_online.php");

因此此代码正在连续执行 set_online.php 文件。

在服务器端,即在 set_online.php 中执行以下代码

$query = "UPDATE my_db SET last_active = '{$current_time}' WHERE id = {$_SESSION["id"]}";
                $result = mysqli_query($connection, $query);

现在我对此有两个担忧:

  1. 由于数据库实时更新last_active,会不会影响服务器负载?
  2. 只要用户在网站上,连接就会打开,是否会产生漏洞?

SSE 不适合此目的 - 或者至少不是为此目的而设计的。 SSE 是源源不断的事件 服务器 浏览器。

不过,您的脚本会起作用。 PHP 脚本会做一件事(更新数据库)然后退出。当它退出时,连接关闭。浏览器会看到连接已经断开,几秒钟后会重新连接。当循环重复时。

关于你的两个问题: 1. 它不是真正连续的,更多的是每 3 秒重新连接一次。服务器负载可能很大。 2、连接没有持续打开;但如果是的话,它不会产生任何新的漏洞。

我会在 JavaScript 间隔内使用 ajax 调用,而不是 SSE。这些优势:

  • 较旧的技术,因此支持更广泛的浏览器
  • 明确控制计时器间隔,因此您可以控制延迟和服务器负载之间的平衡。

你的解决方案很繁重,没有必要,更好的方案是反过来,让服务器推送用户状态信息给你的客户端。

您可以通过使用 socket.io 等库实现套接字来实现此目的。它实现起来非常简单,并且是一个更具可扩展性的解决方案。

基本上,当页面加载时,将在您的客户端和服务器之间建立连接,当服务器想要与客户端通信时,他可以简单地发出一个事件,例如 user-status

您的客户只需收听此事件并相应地更新他们的观点。