2012-03-28 5 views
0

Ich baue in PHP eine Reservierung Website mit einem Zeitplan. Ich suche nach Echtzeit-Updates für meine Benutzer auf effiziente Weise. Ich habe Ajax gefunden, möchte aber nicht, dass der Client den Server nach Updates fragt, sondern dass der Server den aktualisierten Zeitplan an den Client sendet, wenn jemand den Zeitplan bearbeitet hat.So aktualisieren Sie den Client-Zeitplan mit HTML5 Server Gesendete Ereignisse

Ich habe festgestellt, dass die HTML5 Server Sent Events, was ich brauche. Also habe ich eine einfache Testseite ausprobiert, die das Update via SSE retrieve.

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(); 
} 
?> 

Das Problem ist, dass jeder mag 3 Sekunden eine Verbindung gibt es geöffnet was auch immer, wenn die Version ist passend oder nicht, damit ich Ich denke, es ist der Client, der den Server fragt und nicht der Server, der den Client fragt. Was ich möchte, ist eine offene Verbindung zwischen dem Client und dem Server zu halten, damit der Server Änderungen senden kann, wenn ein Update im Zeitplan durchgeführt wird.

Alle Tipps wären willkommen!

Dank

Antwort

1

Der Browser alle 3 Sekunden, weil die Server-Code zu halten ist nicht offen, die Verbindung wird wieder anschließen. Es sendet die Uhrzeit, sobald sie endet. Versuchen Sie etwas mehr wie folgt:

while (true) { 
    echo "data: Page updated at: {$time}\n\n"; 
    flush(); 
    sleep(1); 
} 
+0

Schlaf wird nur den Code richtig pausieren? Nach dem ich suche, ist der Server, eine offene Verbindung mit dem Klienten zu behalten, also, wenn ein anderer Kunde den Plan redigiert, sandte er eine Benachrichtigung zu allen anderen on-line-Klienten, um die Daten mit dem neuen zu aktualisieren. Ist das in SSE möglich? – exomic

+0

@exomic Ja, der Schlaf wird anhalten, sonst wird das Skript alle Serverressourcen aufsaugen und ein neues Datum mehrere tausend Mal pro Sekunde ausspucken. Das signifikante Bit ist die "while" -Schleife. – robertc

Verwandte Themen