Все,
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 script просто отправляет сообщение, а затем заканчивает (как это выглядит в примере 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 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
, как у вас есть одновременные пользователи? Если это так - возможно, это возможно, или подходящий способ создания приложения? И откуда вы знаете, когда вы можете END экземпляр stream.php
?
Мое наивное впечатление заключается в том, что если это так, PHP не подходит для такого типа сервера. Но все демонстрации, которые я видел до сих пор, подразумевают, что PHP для этого просто подходит, поэтому я так запутался...
Спасибо заранее.