JavaScript、PHP - 对多个唯一用户使用服务器发送的事件?

JavaScript, PHP - Using server-sent events with multiple, unique users?

我是 SSE 的新手。服务器发送的事件

上有大量 simple/introductory 文本

但其中 none 涉及为多个不同的用户使用相同的 SSE 文件。

例如:

我有一个站点,用户可以在其中登录。登录后,他们可以查看对他们来说唯一且私有的数据。我希望每个用户在登录时都能获得实时更新,这些更新可能包含也可能不包含敏感信息。为此,我正在实施服务器发送的事件:

JS(直接出其中一个链接)

var source;

if (!!window.EventSource) {
    source = new EventSource("sse.php");
} else {
    ...
}

source.addEventListener("message", function(e) {
    ... do stuff ...
}, false);

PHP

header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
header("Connection: keep-alive");

while (true) {
    $data = \ query DB or any other source
    if ($data) {
        sendMessage($someID, $data);
    }
    sleep(2);
}

function sendMessage($id, $data) {
    echo "id: $id\n";
    echo "data: $data\n\n";
    ob_flush();
    flush();
}

但是以这种方式使用它,我是否只将数据发送给打开 sse.php 源的用户(即每个 EventSource("sse.php") 都是一个新的、唯一的连接)?还是所有已登录、已初始化连接的人都会收到相同的数据?

This SO answer 通过使用唯一事件触及多个用户:

echo "event: ping\n";
$msg1="This is first user";
echo 'data: {"msg": "' . $msg1 . '"}';
echo "\n\n";

echo "event: notify\n";
$msg2="This is second user";
echo 'data: {"msg": "' . $msg2 . '"}';
echo "\n\n";

然后只监听某个事件:

var evtSource = new EventSource("sender.php");
evtSource.addEventListener("ping", function(e) {
var obj = JSON.parse(e.data);
var r_msg = obj.msg;

但这似乎不太合理。如果每个用户都应该接收他们自己的私人提要,那么这种方法将需要我为每个用户硬编码一个唯一的事件。并且,正如原始答案所提到的,它不会阻止略高于平均水平的用户也拦截和阅读所有其他消息。

而且,最重要的是,sse.php 文件不知道它正在为哪个用户收集数据,因此它必须始终为所有用户收集数据。

如何创建一个 sse.php 文件,可以处理无限数量的唯一用户,并且 将数据发送给适当的用户?所以:

  1. 必须有一种方法可以将一些初始化数据(即唯一用户 ID)发送到服务器端文件,并且

  2. 必须有一种方法只让那个特定用户接收收集到的信息

SSE 是一个开放的 HTTP 连接。因此,如果您是这样编程的,它只会向用户发送唯一数据。您可以通过使用 session、cookie、IP 地址等使之成为有状态的,与任何其他 HTTP 请求一样。 SSE 的主要限制是您不能添加任何 headers 来请求连接。

am I only sending the data to the user who opened the sse.php source

是的。

Or will everyone logged on, who has initialized the connection, receive the same data?

没有

If each user is supposed to be receiving their own private feed, then this method would require me to hard-code a unique event for each user

幸运的是没有! SSE "event" 用于通过单个连接向单个用户发送不同类型的事件。 use-case 可能是 Facebook 希望使用一个事件发送聊天更新,另一个事件发送好友请求,另一个事件发送广告等。

在我的书中(使用 HTML5 SSE 的数据推送应用程序,http://shop.oreilly.com/product/0636920030928.do - 为插件道歉!)我认为它是多余的,最好作为 json object你在推。

And, on top of it all, the sse.php file doesn't know which user ...

Cookie 已发送。所以典型的做法是首先登录用户,创建一个 cookie 来验证他们,然后调用 sse 脚本。如果使用支持会话的服务器系统(例如 PHP),则 cookie 是一个实现细节。

POST 数据和自定义 headers,无法发送。因此,如果 cookie 不是一个选项,您必须使用 GET 来 post 一些身份验证 ID(但正如您所注意到的,这不是最好的安全类型)。