Я строю в php сайт бронирования с расписанием. Мне нужны оперативные обновления для моих пользователей. Я нашел Ajax, но я не хочу, чтобы клиент запрашивал у сервера обновления, а сервер отправлял клиенту обновленное расписание, когда кто-то редактировал расписание.
Я обнаружил, что, возможно, мне нужны серверные события HTML5. Поэтому я попробовал простую тестовую страницу, которая получит обновление через SSE.
demo.html
<!DOCTYPE html>
<html>
<body>
<h1>SSE Output</h1>
<div id="result"></div>
<h1>Debug Console</h1>
<div id="status"></div>
<script>
//SSE si compatible
if(typeof(EventSource)!=="undefined")
{
var i = 1;
var source=new EventSource("demo_sse.php?ver=2");
//Lorsque le serveur envoie un message
source.onmessage=function(event)
{
document.getElementById("result").innerHTML+=event.data + " #" + i + "<br />";
i++;
}
//EventListener
source.addEventListener('message', function(e)
{
console.log(e.data);
//document.getElementById("status").innerHTML+= "Message Recevied<br />";
}, false);
source.addEventListener('open', function(e)
{
// Connection was opened.
document.getElementById("status").innerHTML+= "Connection #" + i + " opened<br />";
}, false);
source.addEventListener('error', function(e)
{
if (e.readyState == EventSource.CLOSED)
{
// Connection was closed.
document.getElementById("status").innerHTML+= "Connection closed<br />";
}
}, false);
//Validation de l'origine du serveur
if (event.origin != 'https://mydomain.com')
{
alert('Looks like the Origin of the EventSource (the schedule\'s live update service) wasn\'t coming from our secure server!');
//return;
}
}
else
{
document.getElementById("result").innerHTML="Sorry, your browser does not support server-sent events...";
}
</script>
</body>
</html>
demo_see.php
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$ver = 2;
$time = date("H:i:s");
if ($ver != $_GET["ver"])
{
echo "data: Page updated at: {$time}\n\n";
flush();
}
?>
Проблема в том, что каждые 3 секунды открывается соединение, независимо от того, соответствует версия или нет, поэтому я думаю, что клиент запрашивает сервер, а не сервер запрашивает клиент. Я хотел бы сохранить открытое соединение между клиентом и сервером, чтобы сервер мог отправлять изменения, когда в расписание вносится какое-либо обновление.
Любые советы будут оценены!
Спасибо