2016-06-07 31 views
4

我是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文件,該文件可以處理無限數量的唯一用戶,並且只有將數據發送給相應的用戶?所以:

  1. 必須有一些初始化數據(即唯一的用戶ID)發送給服務器端文件的方式,和

  2. 必須只有一個特定的用戶接收有辦法收集到的信息

回答

3

我只是在將數據發送給誰開的sse.php源

是用戶。

或者每個人都登錄,誰已經初始化連接,接收相同的數據?

如果每個用戶都應該是接受自己的私人飼料, 那麼這種方法需要我硬編碼一個獨特的事件爲每個用戶

幸運的是,不! SSE「事件」用於將單個連接的不同類型的事件發送給單個用戶。用例可能是Facebook希望使用一個事件來發送聊天更新,另一個事件發送好友請求,另一個發送廣告以顯示等。

在我的書(數據推送應用程序與HTML5 SSE,http://shop.oreilly.com/product/0636920030928.do - 爲插件道歉!)我認爲它是多餘的,並且更好地包含在你所推送的json對象中。

而且,在這一切之上,則sse.php文件不知道哪個用戶...

cookie發送。所以典型的方法是首先登錄用戶,創建一個驗證它們的cookie,然後調用sse腳本。如果使用支持會話的服務器系統(例如PHP),則Cookie是實現細節。

無法發送POST數據和自定義標題。所以,如果cookie不是一個選項,你將不得不使用GET來發布一些認證ID(但正如你注意到的那樣,這不是最好的安全類型)。

0

SSE是一個開放的HTTP連接。所以它只會發送唯一的數據給用戶,如果這是你編程的方式。您可以通過使用會話,cookie,IP地址等來使其成爲有狀態,與其他任何HTTP請求一樣。 SSE的主要限制是你不能添加任何頭來請求連接。

相關問題