У меня странное поведение с SSE.
У меня есть 2 файла, один для стороны сервера и один для клиента браузера.
serverside.php это:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
ob_end_clean();
while( true ) {
set_time_limit(30);
$time = date('d/m/Y H:i:s');
echo 'data: ' . $time . "\n\n";
flush();
error_log('i am here!');
sleep(1);
}
?>
и файл на стороне клиента это:
<!DOCTYPE html>
<html>
<body>
<div id="result"></div>
<script>
var source;
if(typeof(EventSource) === "undefined") {
alert('Problem with your browser.');
}
source = new EventSource("serverside.php");
source.onopen = function (event) {
console.log('streaming SSE opened');
};
source.onmessage = function(event) {
console.log('Streaming Message Received');
document.getElementById("result").innerHTML = event.data;
};
source.onerror = function (event) {
console.log('ERROR EventSource');
}
</script>
</body>
</html>
Если я проверю это, все будет в порядке. Я получил обновленное время в браузере, и когда я закрываю вкладку в своем браузере, Serverside.php не отправляет больше «Я здесь!» сообщение для входа. Это правильное поведение. Когда вкладка браузера закрыта, серверыide.php должны остановиться.
Но теперь, если я удалю или прокомментирую эти строки в файле serveride.php:
// echo 'data: ' . $time . "\n\n";
// flush();
Файл serveride.php остается таким:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
ob_end_clean();
while( true ) {
set_time_limit(30);
$time = date('d/m/Y H:i:s');
// echo 'data: ' . $time . "\n\n";
// flush();
error_log('i am here!');
sleep(1);
}
?>
То есть никаких данных сброса вообще.
Если сейчас я загружу index.php, я ничего не получу от serveride.php.
Но в этом случае, когда я закрываю вкладку браузера, Serverside.php продолжает работать и отправлять в журнал сообщения «Я здесь».
Кроме того, если серверыide.php отправляет данные и после отправки некоторых сообщений перестает отправлять больше данных, поведение остается тем же. Сообщения «Я здесь» продолжают поступать после закрытия вкладки.
- Если я закрою вкладку браузера во время отправки данных с serveride.php, все будет нормально.
- Если я закрою вкладку браузера после того, как данные были отправлены и ничего не отправлено с Serverside.php, Serverside.php продолжит работать.
Что это за объяснение?
Я полностью застрял.