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

标签 javascript php server-sent-events

我是 SSE 的新手。服务器发送的事件有很多简单/介绍性的文字

但他们都没有涉及为多个不同的用户使用相同的 SSE 文件。

例如:

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

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;

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

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

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

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

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

最佳答案

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“事件”用于通过单个连接向单个用户发送不同类型的事件。一个用例可能是 Facebook 希望使用一个事件来发送聊天更新,另一个事件用于发送好友请求,另一个事件用于发送要展示的广告,等等。

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

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

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

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

关于JavaScript、PHP - 对多个唯一用户使用服务器发送的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37670005/

相关文章:

php - 尝试使用 PHP DOM 替换节点文本而不更改子节点

javascript - SSE (EventSource) 在 1 小时 22 分钟后超时。有什么方法可以保持它的持久性吗?

android - 服务器在 Android 中发送事件

javascript - 必须提交两次 props.history.push 才能生效

javascript - mustache 模板 : nested templates

javascript - VueJS指令计算div是否滚动到底部

php - 使用 UNION ALL SQL 查询获取更多值

javascript - JS 脚本 - if 语句忽略 jQuery 代码

php - 使用 Jquery .ajax() 将数据插入数据库 & PHP 不起作用

node.js - 带有 EventSource 的 Express.js 中的内存泄漏