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. 只要用户在网站上,连接就会打开,是否会产生漏洞?
4

2 回答 2

2

SSE 不适合这个目的——或者至少不是为它设计的。SSE 是从服务器浏览器的持续事件流。

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

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

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

  • 较旧的技术,因此更广泛的浏览器支持
  • 显式控制计时器间隔,因此您可以控制延迟和服务器负载之间的平衡。
于 2017-06-05T08:33:44.973 回答
2

您的解决方案繁重且不必要,更好的解决方案是扭转想法,让服务器将用户状态信息推送给您的客户端。

您可以通过使用诸如socket.io之类的库来实现套接字来实现这一点。它实现起来非常简单,并且是一种更具可扩展性的解决方案。

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

您的客户可以简单地收听此事件并相应地更新他们的视图。

于 2017-06-05T08:39:49.697 回答