我是SSE全新的。有很多簡單/入門文本對服務器發送事件JavaScript,PHP - 將服務器發送的事件與多個唯一用戶一起使用?
但他們沒有使用相同的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
文件,該文件可以處理無限數量的唯一用戶,並且只有將數據發送給相應的用戶?所以:
必須有一些初始化數據(即唯一的用戶ID)發送給服務器端文件的方式,和
必須只有一個特定的用戶接收有辦法收集到的信息