Недавно я обнаружил EventSource, в YUI3 есть модуль галереи для нормализации и резервного поведения, это то, что я решил использовать в своем примере, поскольку я уже использую эту структуру.
Так что я довольно много искал, прочитал много блогов, сообщений и примеров, и все они показывают примерно одно и то же: как настроить основные события SSE. Теперь у меня есть 6 примеров срабатывания событий открытия/сообщения/ошибки/закрытия.
Чего у меня нет (что, как я надеялся, даст эта ссылка me) является примером того, как запускать события SSE, которые более полезны для моего приложения, я пробую событие под названием «обновление».
Вот моя основная тестовая страница: http://codefinger.co.nz/public/yui/eventsource/test.php (с тем же успехом это может быть html-файл, здесь пока нет php-кода)
А вот 'message.php' в конструкторе EventSource:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
/**
* Constructs the SSE data format and flushes that data to the client.
*
* @param string $id Timestamp/id of this connection.
* @param string $msg Line of text that should be transmitted.
*/
function sendMsg($id, $msg) {
echo "id: $id" . PHP_EOL;
echo "data: $msg" . PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}
while(true) {
$serverTime = time();
sendMsg($serverTime, 'server time: ' . date("h:i:s", time()));
sleep(10);
}
// I was hoping calling this file with a param might allow me to fire an event,
// which it does dutifully, but no browsers register the 'data : update' - though
// I do see the response in Firebug.
if( $_REQUEST['cmd'] ){
sendMsg($serverTime, $_REQUEST['cmd'] );
}
?>
Из приведенного выше живого примера вы можете видеть, что я пытался использовать модуль ввода-вывода YUI для отправки запроса с параметром для запуска моего события «обновление», когда я нажимаю кнопку «обновить». Кажется, это работает, как вы можете видеть на панели сети Firebug, но мое событие не обрабатывается (я понимаю, что приведенный выше скрипт снова запустит этот цикл, я просто хочу, чтобы мое событие обрабатывалось в подключенных браузерах, затем я удалю /уборка).
Я делаю эту часть неправильно? Или есть что-то более фундаментальное, что я делаю неправильно? Я пытаюсь отправить события в ответ на изменение состояния моего пользовательского интерфейса.
Этот ТАК вопрос, казалось, был близок, @tomfumb прокомментировал, что его следующим вопросом будет «как отправлять новые события клиенту после установления первоначального соединения — теперь я вижу, что PHP просто должен никогда не прекращать выполнение». Но, конечно же, я бы отправлял события только тогда, когда они происходят... а не постоянно...