Wszystko,
HTML5 Rocks ma fajny samouczek dla początkujących na temat zdarzeń wysyłanych przez serwer (SSE):
http://www.html5rocks.com/en/tutorials/eventsource/basics/
Ale nie rozumiem ważnej koncepcji - co wyzwala zdarzenie na serwerze, które powoduje wysłanie wiadomości?
Innymi słowy - w przykładzie HTML5 - serwer po prostu wysyła raz znacznik czasu :
<?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()));
Gdybym budował praktyczny przykład - np. „Ścianę” w stylu Facebooka lub giełdę, w której serwer „wysyłałby” nową wiadomość do klienta za każdym razem, gdy zmieniają się dane, jak to działa?
Innymi słowy ... Czy skrypt PHP ma pętlę, która działa w sposób ciągły, sprawdzając zmiany w danych, a następnie wysyłając wiadomość za każdym razem, gdy ją znajdzie? Jeśli tak - skąd wiesz, kiedy zakończyć ten proces?
Lub - czy skrypt PHP po prostu wysyła wiadomość, a następnie kończy (jak wygląda to w przykładzie z HTML5Rocks)? Jeśli tak - w jaki sposób otrzymujesz ciągłe aktualizacje? Czy przeglądarka po prostu odpytuje stronę PHP w regularnych odstępach czasu? Jeśli tak - w jaki sposób to „zdarzenie wysłane przez serwer”? Czym różni się to od pisania funkcji setInterval w JavaScript, która używa AJAX do wywoływania strony PHP w regularnych odstępach czasu?
Przepraszam - to prawdopodobnie niesamowicie naiwne pytanie. Ale żaden z przykładów, które udało mi się znaleźć, nie wyjaśnia tego jasno.
[AKTUALIZACJA]
Myślę, że moje pytanie było źle sformułowane, więc oto kilka wyjaśnień.
Załóżmy, że mam stronę internetową, na której powinna być wyświetlana najnowsza cena akcji Apple.
Gdy użytkownik po raz pierwszy otwiera stronę, strona tworzy EventSource z adresem URL mojego „strumienia”.
var source = new EventSource('stream.php');
Moje pytanie brzmi: jak powinien działać plik „stream.php”?
Lubię to? (pseudo kod):
<?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
}
?>
Innymi słowy - czy „stream.php” pozostaje otwarty tak długo, jak długo klient jest z nim „połączony”?
Jeśli tak - czy to oznacza, że masz uruchomionych tyle wątków, stream.php
ile masz jednocześnie użytkowników? Jeśli tak - czy jest to wykonalne zdalnie, czy też jest to właściwy sposób tworzenia aplikacji? A skąd wiesz, kiedy możesz ZAKOŃCZYĆ wystąpienie stream.php
?
Mam naiwne wrażenie, że jeśli tak jest, PHP nie jest odpowiednią technologią dla tego rodzaju serwera. Ale wszystkie dema, które widziałem do tej pory, sugerują, że PHP jest do tego w porządku, dlatego jestem tak zdezorientowany ...