Все,
В HTML5 Rocks есть хороший учебник для начинающих по серверным событиям (SSE):
http://www.html5rocks.com/en/tutorials/eventsource/basics/
Но я не понимаю важной концепции - что запускает событие на сервере, которое вызывает отправку сообщения?
Другими словами, в примере HTML5 сервер просто отправляет временную метку один раз :
<?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()));
Если бы я создавал практический пример - например, «стену» в стиле Facebook или биржевую бирку, в которой сервер «отправлял бы» новое сообщение клиенту каждый раз, когда какой-либо фрагмент данных изменяется, как это работает?
Другими словами ... Есть ли в сценарии PHP цикл, который выполняется непрерывно, проверяя наличие изменений в данных, а затем отправляя сообщение каждый раз, когда он его находит? Если да, то как узнать, когда закончить этот процесс?
Или - сценарий PHP просто отправляет сообщение, а затем завершает работу (как это, похоже, имеет место в примере HTML5Rocks)? Если да - как получить постоянные обновления? Браузер просто регулярно опрашивает PHP-страницу? Если да, то как это «событие, отправленное сервером»? Чем это отличается от написания функции setInterval в JavaScript, которая использует AJAX для вызова страницы PHP через регулярные промежутки времени?
Извините - наверное, это невероятно наивный вопрос. Но ни один из примеров, которые мне удалось найти, не проясняет это.
[ОБНОВИТЬ]
Я думаю, что мой вопрос был сформулирован плохо, поэтому вот некоторые пояснения.
Допустим, у меня есть веб-страница, на которой должна отображаться самая последняя цена акций Apple.
Когда пользователь впервые открывает страницу, страница создает EventSource с URL-адресом моего «потока».
var source = new EventSource('stream.php');
У меня такой вопрос - как должен работать "stream.php"?
Как это? (псевдокод):
<?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
}
?>
Другими словами, "stream.php" остается открытым, пока клиент "подключен" к нему?
Если да, значит ли это, что у вас работает столько же потоков, stream.php
сколько у вас одновременно работают пользователи? Если да, возможно ли это удаленно или это подходящий способ создания приложения? И как узнать, можно ли закончить экземпляр stream.php
?
У меня наивное впечатление, что в этом случае PHP не подходит для такого типа серверов. Но все демонстрации, которые я видел до сих пор, подразумевают, что PHP отлично подходит для этого, поэтому я так смущен ...