PHP/VanillaJS Long Polling Chat

CPU

Neu angemeldet
Registriert
16 Feb. 2015
Beiträge
238
Ich würde gerne für ein Projekt einen Chat schreiben mit der Long Polling-Technik, habe dazu aber noch nichts Nützliches gefunden, was mich an dieser Stelle weiter bringt. WebSockets möchte ich nicht verwenden, da es nicht 100%ig kompatibel mit allen Browsern ist. Wie funktioniert nun Long Polling?
Würde mich freuen, wenn mir hier jemand weiterhelfen könnte.
 
Dein Problem ist das du offensichtlich noch nicht mal weisst was du vorhast, arbeite erst mal an der Zielsetzung.

Der Startpost klingt nach Marketing bevor man ein Produkt hat. Irgendwas mit Blockchain!
 
  • Thread Starter Thread Starter
  • #3
Ich kenne schon mein Ziel. Ich kann es hier gerne auch erklären, aber ich wollte nur grundsätzlich etwas über Long Polling erfahren. Mehr nicht. Andere Frage, kannst du mir weiterhelfen? Kennst du dich damit aus?

Falls ja, angenommen ich habe ein Formular mit einer Textbox und einem Submitbutton. Darüber befindet sich das Chatfenster. Wie genau nutze ich nun Long Polling um an die Daten zu kommen, die mein Chatpartner abschickt? Also wie komme ich per AJAX (Long Polling) an meine Daten? Was muss ich beachten beim JavaScript und was beim PHP-Backend?
 
Es scheint mir technisch keine bersonders elegante Lösung zu sein, zumindest nicht für einen Chat und Browser mochten es zumindest in der Vergangenheit nicht besonders.

Es liegt einfach in der Natur der Sache das "Long Polling" nur die Wiederbelebung eines Problems ist das man vor Jahrzehnten durch den Pseudonversationsmodus gelöst hat. Zumindest sieht es für mich stark danach aus, insbesondere im Chat Kontext. Deswegen denke ich das du eben nicht weisst was du willst.
 
  • Thread Starter Thread Starter
  • #5
Es ist aber besser als jede halbe Sekunde die Daten per AJAX abzufragen, das würde den Server irgendwann überlasten. Ob elegant oder nicht, das lass mal meine Entscheidung sein. Oder kannst du mir eine Alternative außer WebSockets vorschlagen?
 
Würde es eben nicht. Also lag ich richtig.

Zumal 500ms sowieso schon meines Erachtens eine viel zu hohe Frequenz für einen chat ist. Die hälfte würds vermutlich tun.

Erkundige dich mal etwas wie Ressourcenmanagement in modernendigitalen Systemen funktioniert, welche Probleme es gibt und wie sie gelöst wurden. Such mal "slowloris dos".
 
  • Thread Starter Thread Starter
  • #7
Also würdest du sagen, ich soll es einfach per AJAX ohne Long Polling machen und gut?
Es geht mir darum, dass es fast Realtime sein soll.
 
Welcher Browser soll den Probleme machen? Websockets werden doch schon länger von allen unterstütz?
Sonst gibt es diverse Bibliotheken, auch für PHP die z.b. Auch fallback Szenarien anbieten nur für die die keine socket Verbindung hin bekommen. Socket.io ist da auch noch was...
 
  • Thread Starter Thread Starter
  • #9
Also ich habe es im Chrome nicht zum laufen gebracht. Und da ich den Apache nicht neu konfigurieren kann auf meinem Webspace möchte ich das ohne WebSockets erstellen.
 
Ja bei webspace dürfte das in der Tat nicht gehen, das liegt dann aber nicht am Browser.
In diesem Fall hast du auch Probleme mit long polling. Im endefeckt sagst du dem Client ja du rufst die Chat.php auf und beim Aufruf der Seite holst du am Server die Infos aus der db, sendest sie und beendest aber nicht das Script sondern lässt es laufen / lässt die Verbindung bestehen. Du prüfst nun ständig nach neuen Einträgen (was übrigens ziemlich prozessorlastig ist) und sendest sie raus. Das geht aber nur solange bis die max execution Time erreicht ist die für deine Scripte gesetzt ist. Die kannst du bei webspace nicht ändern.

Nebenbei ist die Anzahl der Verbindungen in diesem Fall ja eine pro chatter ... Jederzeit.
Wenn du alle 500ms per Ajax frägst und deine ausführzeit bei 10na liegt (der Code zum nachladen sollte nur auth und nachgucken sein) dann hast du pro Sekunde zur selben Zeit weit weniger Verbindungen gleichzeitig als du chattet hast.
Die gesamte Zahl an Anfragen ist erst mal weniger wichtig, das geht maximal auf den Traffic, nicht aber auf die Ressourcen.
 
  • Thread Starter Thread Starter
  • #11
Ja bei webspace dürfte das in der Tat nicht gehen, das liegt dann aber nicht am Browser.
In diesem Fall hast du auch Probleme mit long polling. Im endefeckt sagst du dem Client ja du rufst die Chat.php auf und beim Aufruf der Seite holst du am Server die Infos aus der db, sendest sie und beendest aber nicht das Script sondern lässt es laufen / lässt die Verbindung bestehen. Du prüfst nun ständig nach neuen Einträgen (was übrigens ziemlich prozessorlastig ist) und sendest sie raus. Das geht aber nur solange bis die max execution Time erreicht ist die für deine Scripte gesetzt ist. Die kannst du bei webspace nicht ändern.

Nebenbei ist die Anzahl der Verbindungen in diesem Fall ja eine pro chatter ... Jederzeit.
Wenn du alle 500ms per Ajax frägst und deine ausführzeit bei 10na liegt (der Code zum nachladen sollte nur auth und nachgucken sein) dann hast du pro Sekunde zur selben Zeit weit weniger Verbindungen gleichzeitig als du chattet hast.
Die gesamte Zahl an Anfragen ist erst mal weniger wichtig, das geht maximal auf den Traffic, nicht aber auf die Ressourcen.

Das was du sagst stimmt nicht so ganz, das habe ich z.B. komplett anders verstanden (habe mich dazu natürlich ein bisschen eingelesen). Man prüft nicht ständig nach neuen Daten, man bekommt die Daten, wenn eine Änderung statt gefunden hat bzw. wenn ein neuer Eintrag in der Datenbank vorhanden ist, ansonsten nicht! Frag mich aber nicht wie man das technisch umsetzt, habe nur Theorie gelesen und kein Codebeispiel gesehen. Allerdings hast du natürlich mit der "Max Execution Time" recht, diese macht mir natürlich beim Long Polling ein Strich durch die Rechnung. Daran habe ich gar nicht gedacht.

--- [2018-12-07 13:08 CET] Automatisch zusammengeführter Beitrag ---

Habe mir jetzt überlegt das ganze mit NodeJS zu machen und mit WebSockets. Daher stellt sich gar nicht mehr die Frage nach dem Long Polling bzw. wie man das mit PHP macht. Danke für die Antworten.
 
Zuletzt bearbeitet:
Short polling -> Anfrage "Gib mir Daten" ... einige ms später -> Da hast Du sie

Long Polling -> Anfrage "Gib mir Daten, ich halte die Verbindung mal offen, und vergesse die Bedeutung eines Timeouts" .........viel später -> Da hast Du sie.

Bei GitHub gibt es einige Projekte dazu (z.B. )
 

Deswegen mien Hinweis darauf dich mal zu erkundiogen wie Digitaltechnik funktioniert. Insbesondere CPUs kennen nativ kein warten. Wenn du tatsächlich warten würsest würde auch die Reaktionszeit massiv leiden. Effektiv bedeute Longpolling daher auf beiden Sieten deutlich mehr Last für schnellere Reaktionen.

Wenn digital irgendwas wartet braucht es einen externen Anstoß, also kann der externe Anstoßer nicht warten. Wenn ein Client eine Verbindung zu einem Server aufmacht und sagt lass offen. Dann müssen beide Seiten und alle Instanzen dauernd nach Updates checken.

Das verbirgt der Abstraktionslayer lediglich vor dir. Das heisst nicht das es nicht da ist. Zusätzlich muss für offene Verbindungen Permanent der Speicher reserviert bleiben, daher skaliert es auch da erhebllich schlechter.
Also doch, die Antowrt von drfuture stimmt, man muss nur die gesamte Technik berücksichtigen und nicht nur den Abstraktionslayer mit dem man arbeitet.

Anderes Beispiel für die slebe Problematik:
Ich habe eine Knopf, der einen Email an ein Restaurant schickt und eine zahlung druchführt.

Also muss ich nur auf den Knopf drücken, dann bekomme ich Pizza.
=> Knopf drücken = Pizza

Alternativ muss ich zum Laden, alle Zutaten kaufen und mir sleber Pizza machen.
=> man das ist ja total unnötig kompliziert, ich bleib lieber beim Knopf, das ist wesentlich weniger Aufwand. Wie blöd muss man eigentlich sein Pizza zu backen wenn man einfach Knöpfe drücken kann? Warum ist der Scheiss so teuer?
Den blöden Knopf zu drücken dauert doch nichtmal 1 Sekunde!
 
  • Thread Starter Thread Starter
  • #14
Wie gesagt ich löse das Problem jetzt mit Node.js :unknown:
 
Zurück
Oben