Alles,
HTML5 Rocks hat ein nettes Anfänger-Tutorial zu Server-Sended Events (SSE):
http://www.html5rocks.com/de/tutorials/eventsource/basics/
Ich verstehe jedoch kein wichtiges Konzept - was löst das Ereignis auf dem Server aus, durch das eine Nachricht gesendet wird?
Mit anderen Worten - im HTML5-Beispiel - sendet der Server einfach einmal einen Zeitstempel :
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
function sendMsg($id, $msg) {
echo "id: $id" . PHP_EOL;
echo "data: $msg" . PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}
$serverTime = time();
sendMsg($serverTime, 'server time: ' . date("h:i:s", time()));
Wenn ich ein praktisches Beispiel erstellen würde - z. B. eine "Pinnwand" im Facebook-Stil oder einen Börsenticker, in dem der Server jedes Mal, wenn sich Daten ändern, eine neue Nachricht an den Client "sendet", wie funktioniert das?
Mit anderen Worten ... Verfügt das PHP-Skript über eine Schleife, die kontinuierlich ausgeführt wird, nach einer Änderung der Daten sucht und dann jedes Mal eine Nachricht sendet, wenn es eine findet? Wenn ja - woher wissen Sie, wann Sie diesen Prozess beenden müssen?
Oder - sendet das PHP-Skript einfach die Nachricht und endet dann (wie es im HTML5Rocks-Beispiel der Fall zu sein scheint)? Wenn ja - wie erhalten Sie fortlaufende Updates? Fragt der Browser die PHP-Seite einfach in regelmäßigen Abständen ab? Wenn ja - wie ist das ein "vom Server gesendetes Ereignis"? Wie unterscheidet sich dies vom Schreiben einer setInterval-Funktion in JavaScript, die AJAX verwendet, um eine PHP-Seite in regelmäßigen Abständen aufzurufen?
Entschuldigung - das ist wahrscheinlich eine unglaublich naive Frage. Aber keines der Beispiele, die ich finden konnte, macht dies deutlich.
[AKTUALISIEREN]
Ich denke, meine Frage war schlecht formuliert, daher hier einige Erläuterungen.
Angenommen, ich habe eine Webseite, auf der der aktuelle Kurs der Apple-Aktie angezeigt werden soll.
Wenn der Benutzer die Seite zum ersten Mal öffnet, erstellt die Seite eine EventSource mit der URL meines "Streams".
var source = new EventSource('stream.php');
Meine Frage ist: Wie soll "stream.php" funktionieren?
So was? (Pseudocode):
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
function sendMsg($msg) {
echo "data: $msg" . PHP_EOL;
echo PHP_EOL;
flush();
}
while (some condition) {
// check whether Apple's stock price has changed
// e.g., by querying a database, or calling a web service
// if it HAS changed, sendMsg with new price to client
// otherwise, do nothing (until next loop)
sleep (n) // wait n seconds until checking again
}
?>
Mit anderen Worten - bleibt "stream.php" geöffnet, solange der Client mit ihm "verbunden" ist?
Wenn ja - bedeutet dies, dass so viele Threads ausgeführt werden, stream.php
wie Sie gleichzeitig Benutzer haben? Wenn ja - ist dies aus der Ferne möglich oder eine geeignete Methode zum Erstellen einer Anwendung? Und woher wissen Sie, wann Sie eine Instanz von beenden können stream.php
?
Mein naiver Eindruck ist, dass PHP in diesem Fall keine geeignete Technologie für diese Art von Server ist. Aber alle Demos, die ich bisher gesehen habe, implizieren, dass PHP dafür in Ordnung ist, weshalb ich so verwirrt bin ...
EventSource('stream.php')
, öffnet der Client eine Verbindung, mit stream.php
der er wie von Ajax aufgerufen wird. DIESE Verbindung löst Ihren serverseitigen Code aus und hält die Verbindung offen, solange Ihr serverseitiger Code etwas zu sagen hat. Dann wird die Verbindung geschlossen und nach einer kurzen Verzögerung (3 Sekunden in Chrome, glaube ich) öffnet der Client die Verbindung wieder, wodurch Ihre stream.php
Datei erneut ausgelöst wird.