Как обновить расписание клиента, используя отправленные события сервера HTML5 - PullRequest
0 голосов
/ 29 марта 2012

Я строю в 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 секунды открывается соединение, независимо от того, соответствует версия или нет, поэтому я думаю, что клиент запрашивает сервер, а не сервер запрашивает клиент. Я хотел бы сохранить открытое соединение между клиентом и сервером, чтобы сервер мог отправлять изменения, когда в расписание вносится какое-либо обновление.

Любые советы будут оценены!

Спасибо

1 Ответ

1 голос
/ 29 марта 2012

Браузер переподключается каждые 3 секунды, потому что код вашего сервера не поддерживает соединение открытым.Он отправляет время один раз, затем заканчивается.Попробуйте что-то вроде этого:

while (true) {
    echo "data: Page updated at: {$time}\n\n";
    flush();
    sleep(1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...