Я хочу написать просмотрщик журналов в реальном времени и только что узнал о SSE. Я смущен тем, как правильно использовать его. Я запускаю сервер Linux с php 5.4. У меня есть этот код прямо сейчас:SSE не поддерживает связь
HTML + JS:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<ul id='el'></ul>
<script type="text/javascript">
var eSource = new EventSource("ssedemo.php");
eSource.onmessage = function(event) {
var e = document.createElement("li");
e.innerHTML = event.data;
document.getElementById('el').appendChild(e);
};
</script>
</body>
</html>
PHP:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$time = date('r');
echo "data: The server time is: {$time}\n\n";
ob_flush();
flush();
?>
Это работает, но он разрывает соединение после каждого обновления и клиента восстанавливает его каждый 3 секунды. Я бы хотел, чтобы он обновлялся быстрее. Из документации и руководств в Интернете, кажется, что правильный способ использовать SSE, чтобы обернуть код сервера в цикле для поддержания соединения, а также использовать sleep
для управления временем обновления:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while(true) {
$time = date('r');
echo "data: The server time is: {$time}\n\n";
ob_flush();
flush();
sleep(1);
};
?>
Проблема заключается в том, что это не работает. Всякий раз, когда я вводил цикл, onmessage
никогда не вызывается на стороне клиента. Я пробовал множество примеров без изменения кода(), (https://developer.mozilla.org/en-US/docs/Server-sent_events/Using_server-sent_events) и т. Д., Но никто из них не работает, если я не удаляю цикл из php.
Почему я не могу поддерживать соединение? Что-то изменилось в php 5.4, что мешает этому работать?
Какой браузер вы используете? И это сервер localhost или удаленный сервер? –
удаленный сервер. Я пробовал с Chrome, Firefox и IE, одинаковое поведение во всех случаях. – Cbas
Будучи второстепенным, я полагаю, что у вас нет вывода вообще с вашим первым примером (no-while-loop) с IE (поскольку он не поддерживает SSE)? –