LongPolling/Comet - so richtig?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • LongPolling/Comet - so richtig?

    Hi,

    ich bastele gerade eine Page, bei der ich nun "LongPolling" bzw. "Comet" benutzen wollte um bei Änderungen in einer Datenbank vom Server benachrichtigt zu werden, ohne das er client ständig anfragen muss...

    Dazu habe ich ein Bsp. gefunden. Client:

    HTML-Quellcode

    1. <html>
    2. <head>
    3. <title>LongPolling Test</title>
    4. <script type="text/javascript">
    5. var xmlhttpreq = null;
    6. function GetHTTPRequest() {
    7. var xmlhttp = false;
    8. try {
    9. xmlhttp = new XMLHttpRequest();
    10. } catch (trymicrosoft) {
    11. try {
    12. xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    13. } catch (othermicrosoft) {
    14. try {
    15. xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    16. } catch (failed) {
    17. xmlhttp = false;
    18. }
    19. }
    20. }
    21. return xmlhttp;
    22. }
    23. xmlhttpreq = GetHTTPRequest();
    24. function StartRequest() {
    25. // Persistente Verbindung öffnen
    26. xmlhttpreq.open('GET', 'longpolling.php', true);
    27. xmlhttpreq.onreadystatechange = handle_response;
    28. xmlhttpreq.send(null);
    29. }
    30. function handle_response() {
    31. if (xmlhttpreq.readyState==4 && xmlhttpreq.status==200) {
    32. document.getElementById('printarea').innerHTML = xmlhttpreq.responseText;
    33. }
    34. // Bei Verbindungsabbruch gleich neu initialisieren
    35. if (xmlhttpreq.readyState==4) {
    36. StartRequest();
    37. }
    38. }
    39. </script>
    40. </head>
    41. <body onload="StartRequest();">
    42. <div id="printarea"><h1>Hier erscheint die Serverantwort</h1>
    43. </div>
    44. </body>
    45. </html>
    Alles anzeigen



    Server:

    PHP-Quellcode

    1. <?php
    2. $i=0;
    3. while($i < 500) {
    4. $i++;
    5. usleep(1000000);
    6. }
    7. echo $i;
    8. ?>



    Beim Server habe ich nun vor aus der while-Schleife eine endlos-Schleife zu basteln und innerhalb dieser, sagen wir mal im 30 Sekunden Abstand, eine Datenbankabfrage stellen... Sollten dort nun ein neuer Datensatz hinzukommen soll der Client benachrichtigt werden und von vorne...

    Ist das die richtige vorgehensweise? Überfordet das den Serve rnicth wenn z.B. 100 User gleichzeitg (unabhängig) auf Änderungen warten? Falls ja, wie kann man es eleganter lösen?

    Danke
  • BearTi schrieb:

    Ist das die richtige vorgehensweise? Überfordet das den Serve rnicth wenn z.B. 100 User gleichzeitg (unabhängig) auf Änderungen warten? Falls ja, wie kann man es eleganter lösen?

    Naja, du verlagerst die Ressourcen. Wenn 100 User MIT COMET 30 Sekunden auf deinem Chat sind, dann hast du 100 Apache Requests. Vermutlich ist die Anzahl an Apaches bei einem Shared Hoster begrenzt.
    Wenn das OHNE COMET geschieht, dann hast du (beim Update Intervall von einer Sekunde) 3.000 Apache Requests inkl Session Initialisierung, etc. Der ganze Verbindungsoverhead ist schlecht für User und Server.

    Zum Thema Comet habe ich auch ein paar Zeilen zusammengeschrieben: [wiki]AJAX / Comet Chat Tutorial[/wiki]