Всі,
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 просто чудово підходить для цього, ось чому я так розгублений ...