使用EventSource获取用户的在线状态可靠吗?

3

我已经使用了一个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. 由于连接只要用户在网站上,就会一直保持打开状态,这会导致漏洞吗?
2个回答

2
SSE并不适合此目的,或者至少没有为此设计。 SSE是从服务器到浏览器的事件的持续流。
你的脚本将会起作用。 PHP脚本将执行一项任务(更新数据库),然后退出。退出后连接就关闭了。浏览器会看到连接已经断开,并在几秒钟后重新连接。这样循环重复。
关于你的两个问题: 1.它不是真正的连续性,而是每3秒重新连接一次。服务器负载可能很大。 2.连接不是持续打开的;但如果是的话,它不会产生任何新的漏洞。
我建议使用一个JavaScript间隔上的ajax调用,而不是SSE。以下是它的优点:
  • 较旧的技术,因此支持更广泛的浏览器
  • 明确控制时间间隔,这样您可以控制延迟和服务器负载之间的平衡。

2
你的解决方案过于繁重和不必要,更好的解决方案是反转思路,让服务器向客户端推送用户状态信息。
你可以通过使用像 socket.io 这样的库来实现套接字。这很容易实现,并且是一种更可扩展的解决方案。
基本上,当页面加载时,你的客户端会与服务器建立连接,当服务器想要与客户端通信时,它可以简单地发出一个事件,例如user-status
你的客户端可以简单地监听此事件并相应地更新其视图。

你能告诉我如何实现socket.io吗?我已经搜索了相关资料,但是还是无法理解。 - Observer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接