Я сделал бы простые часы с отправленным событием, мой код:
Клиент и сервер находятся в локальной сети, а браузер — 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 минут, после их остановки,
Где я ошибся?
Благодарю.
Ваш 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-скрипт работал вечно, что бесконечный цикл — это дизайн, а не ошибка.
Других решений пока нет …