javascript — простое отправленное сервером событие: остановка часов через 30 минут

Я сделал бы простые часы с отправленным событием, мой код:
Клиент и сервер находятся в локальной сети, а браузер — iceweasel v.38.7.1.

PHP:

<?php
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
header("Connection: keep-alive");
function sendMsg($msg) {
echo "retry: 1000\n";
echo "data: $msg" .PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}
sendMsg(date("H:i", time()));

JS

(function get_time()
{var source = new EventSource('/config/rtc/get_time.php');

source.addEventListener('message',function (event)
{document.getElementById("orologio").innerHTML=event.data;},false);

source.addEventListener('error', function(event) {
if (event.readyState === EventSource.CLOSED)
{get_time();}},false);
})();

Часы работают 30-45 минут, после их остановки,
Где я ошибся?
Благодарю.

2

Решение

Ваш PHP-скрипт должен выглядеть так:

<?php
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
header("Connection: keep-alive");
function sendMsg($msg) {
echo "retry: 1000\n";
echo "data: $msg" .PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}
while(true){
sendMsg(date("H:i", time()));
sleep(1);
}

В противном случае ваш PHP-скрипт постоянно закрывается (что полностью устраняет смысл использования SSE), сокет SSE закрывается, и браузер затем автоматически переподключается. Теоретически до бесконечности, но, возможно, что-то надоело через 30 минут 🙂

Я думал, что проблема будет в тайм-ауте сценария. Поэтому в верхней части вашего PHP-скрипта вы должны добавить:

set_time_limit(0);

Опять же, это говорит о том, что вы хотите, чтобы PHP-скрипт работал вечно, что бесконечный цикл — это дизайн, а не ошибка.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]