2016-06-07 20 views
4

Ich bin brandneu auf SSE. Es gibt viele einfache/einführende Texte auf dem Server gesendet EreignisseJavaScript, PHP - Verwenden von serverseitigen Ereignissen mit mehreren eindeutigen Benutzern?

Aber keiner von ihnen berühren die gleiche SSE-Datei für mehrere verschiedene Benutzer verwenden.

Zum Beispiel:

Ich habe eine Seite, wo die Nutzer anmelden. Wenn sie angemeldet sind, können sie Daten anzeigen, die für sie eindeutig und privat sind. Ich möchte, dass jeder Benutzer Live-Updates erhält, während er eingeloggt ist und möglicherweise keine vertraulichen Informationen enthält. Um dies zu tun Ich bin der Umsetzung server gesendet Ereignisse:

JS (gerade aus einem der Links)

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(); 
} 

Aber es auf diese Weise verwendet wird, Sendet ich die Daten nur an den Benutzer, der die Quelle sse.php geöffnet hat (dh jede EventSource("sse.php") ist eine neue, eindeutige Verbindung)? Oder werden alle, die sich angemeldet haben, wer die Verbindung initialisiert hat, die gleichen Daten erhalten?

This SO answer Berührungen auf mehrere Benutzer, durch einzigartige Events mit:

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"; 

Und dann nur für ein bestimmtes Ereignis zu hören:

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

Aber das scheint kaum angemessen. Wenn jeder Benutzer seinen eigenen privaten Feed erhalten soll, würde diese Methode erfordern, dass ich ein eindeutiges Ereignis für jeden Benutzer fest codiere. UND, wie die ursprüngliche Antwort erwähnt, es verhindert nicht, dass ein leicht überdurchschnittlicher Benutzer auch alle anderen Nachrichten abfängt und liest.

Und obendrein weiß die sse.php Datei nicht, für welchen Benutzer es Daten sammelt, also müsste es alle Benutzer tun, die ganze Zeit.

Wie erstelle ich eine sse.php Datei, die eine unbegrenzte Anzahl von eindeutigen Benutzern verarbeiten kann, und nur die Daten an den entsprechenden Benutzer senden? Also:

  1. muss es eine Möglichkeit geben, einige Initialisierungsdaten (dh eindeutige Benutzer-ID) auf serverseitige Datei zu senden, und

  2. muss es eine Möglichkeit sein, nur dass ein bestimmter Benutzer zu erhalten die gesammelten Informationen

Antwort

3

bin ich nur die Daten an den Benutzer zu senden, der die sse.php Quelle

Ja

geöffnet.

Oder werden alle eingeloggt, wer hat die Verbindung initialisiert, erhalten die gleichen Daten?

Nr

Wenn jeder Benutzer einen eigenen Feed werden soll, sein dann für jeden Benutzer diese Methode würde mich zu hart Code ein einzigartiges Ereignis erfordern

Zum Glück nicht! Das SSE- "Ereignis" dient zum Senden verschiedener Ereignistypen über eine einzelne Verbindung an einen einzelnen Benutzer. Ein Anwendungsfall könnte sein, dass Facebook ein Ereignis zum Senden von Chat-Updates, ein weiteres Ereignis zum Senden von Freundschaftsanfragen, ein anderes zum Senden von Freundschaftsanfragen usw. verwenden möchte.

In meinem Buch (Data Push Apps mit HTML5 SSE, http://shop.oreilly.com/product/0636920030928.do - Entschuldigung für den Stecker!) Ich argumentiere, dass es redundant ist, und besser als Teil des JSON-Objekts enthalten, das Sie drängen.

Und oben drauf alle, die sse.php Datei nicht weiß, welche Benutzer ...

Cookies gesendet werden. Daher besteht die typische Vorgehensweise darin, sich zuerst beim Benutzer anzumelden, ein Cookie zu erstellen, das sie authentifiziert, und dann das SSE-Skript aufzurufen. Wenn Sie ein Serversystem mit Session-Unterstützung (z. B. PHP) verwenden, sind die Cookies ein Implementierungsdetail.

POST-Daten und benutzerdefinierte Header können nicht gesendet werden. Also, wenn Cookies keine Option sind, müssten Sie GET verwenden, um eine Authentifizierungs-ID zu posten (aber wie Sie bemerken, ist das nicht der beste Sicherheitstyp).

0

Ein SSE ist eine offene HTTP-Verbindung. Es sendet also nur eindeutige Daten an einen Benutzer, wenn Sie es so programmieren.Sie können dies stateful machen, indem Sie Sitzungen, Cookies, IP-Adressen usw. verwenden, genauso wie jede andere HTTP-Anfrage. Die Haupteinschränkung von SSE besteht darin, dass Sie keine Header hinzufügen können, um eine Verbindung anzufordern.