AJAX Chat - Direkte Antwort schicken

Noeden

Erfahrenes Mitglied
Hallo,

ich habe mir gerade überlegt, wie man per PHP so einen Chat schreibt.

Vom Prinzip her geht es denke ich so (so habe ich das bei Facebook zumindest verstanden):

Du sendest per AJAX einen Request an den Server und wartest (z.Bsp) 20 Sekunden auf eine Antwort. Wenn keine kommt, frage nochmal und warte wieder. Im JavaScript ist das für mich trivial. Aber wie mache ich das in PHP? Mit einer While schleife? Also muss ich zwangsläufig für jeden Benutzer den Server "blockieren" indem ihm die ganze Zeit ausgeführtes Skript "gehört"?

PHP ist dann wohl nicht das Mittel der Wahl oder?
Gibt es da keine Performance-Probleme bei ... sagen wir mal 100 Leuten (was ja echt ein Witz ist).

Wie unterbinde ich die Antwort von PHP?

Vielen Dank schonmal
Noeden
 
Hi

das, was du beschreibst, ist eine Seite von Ajax.
Lang warten, Wenn keine Antwort sofort wieder lang warten, Aha Antwort, ok, jetzt wieder warten...
Die andere Seite wäre, dass JS regelmäßig eine Anfrage sendet, die sofort wieder beendet wird.
Egal ob Chatnachricht da oder nicht. Dann Leerlauf auf JS-Seite bis zur nächsten Anfrage.

Aus Nutzersicht werden die Nachrichten bei deiner Variante vermutlich minimal schneller zugestellt.

Aus Programmsicht:
a) PHP muss seine Warteschleife ja nicht unter Vollast laufen lassen,
sondern kann pro Schleifendurchgang zB. 1 Millisekunde warten.
Entlastet den Prozessor enorm.
Natürlich verzögert sich eine Antwortlieferung dadurch auch wider etwas,
verglichen zum Wartezeitlosen, aber 1ms sollte verkraftbar sein.

Mit komplexeren Sachen als ein "normales" apachemäßiges PHP-Skript
könnte man den Resourcenbedarf vllt. noch etwas verringern,
aber: Bei einem schnellen Computer und mit Schleifenwartezeit
dürfte die Grenze eher zuerst bei der Socketanzahl erreicht werden.
Es gibt ein theoretisches Limit von ca. 65000 Verbindungen gleichzeitig,
in der Praxis liegts drunter, weil nicht alles verwendet werden kann.
Wenn also alle Clients praktisch eine Dauerverbindung zum Server wollen...
gut, bei 100 wirds kein Problem, aber vom Prinzip.

Zumindest die Verbindungsanzahl wäre bei der Nur-kurz-verbunden-Variante kein derartiges Problem. Dafür liegt die Belastung der anderen Sachen vermutlich über der Dauerverbindung+Wartezeit (immer wieder Verbindungsaufbau,
PHP anstarten etc.etc. für jeden Client regelmäßig)

...
Solang auf der entsprechenden Seite eine kleine Wartezeit ist
und der Server nicht von <2000 ist wirds mit 100 Usern kein Problem geben.
Also bei der Langverbindungslösung kleine Pause in der PHP-Schleife,
bei Kurzverbindung Pause zwischen den Ajax-Anfragen
(das ist sowieso schon deswegen nötig, um dem Browser Luft zu geben)
 
Hi, vielen Dank schonmal für Deine Antwort.

Für mich klingt die Langwartezeitenmethode interessanter, ist ja auch die, die ich bei Facebook abgeschaut hatte.

Habe ich Dich jetzt richtig verstanden, dass es auch bei 3000 Nutzern noch keine Probleme geben sollte mit dieser Methode? Das wäre eine Grenze bei der ich das dann eh versuchen würde zu monetarisieren, dann kann man sich auch n Cluster leisten. Solang ich das aber aus eigener Tasche bezahle (was ja wahrscheinlich für immer der Fall sein wird) wäre mir das zu viel.

Und wie würde ich dann serverseitig vorgehen? Da meine PHP-Skripe eh maximal 90 Sekunden laufen dürfen, würde ich mir eine while-Schleife bauen, die nach 80000 Durchläufen einfach ein exit(); drin hat und clientseitig nach 80 Sekunden wieder anfragen? Oder wie beende ich PHP?

Vielen, vielen Dank!
 
3000..hmm.
Theoretisches Problem gibts keins.
Aber

a) Da ja zumindest einiges an Speicher belegt wird
(vor allem für den ganzen Unterbau deines Programms)
wäre die ungefähre Belastung zuerst mal auszuprobieren.
Wie der Speicherstand ausschaut.

Muss ja nicht das eigentliche Projekt sein, ein kleines Beispielding reicht auch.
Eine fast leere HTML-Seite, die eben entsprechende Ajax-Anfragen zu einem
PHP-Skript schickt, dass in der Schleife ähnlich viel macht,
wie dann vom Hauptprogramm zu erwarten ist. (SQL-Abfragen etc.
Irgendwo "paar" Testnachrichten generieren und alles,
was beim Hauptprogramm nötig sein wird (Joins auf Usertabelle...) immer wieder abfragen lassen)

b) Wenn du schreibst, deine Skripte dürfen max. 90 Sekunden laufen,
ist es also ein Server ohne Rootrechte?
Die Laufzeit ist nicht das Problem, aber einige andere Sachen
wie max. Verbindungsanzahl vom Apache sind auch irgendwo eingestellt
und könnten je nach Wert ein Problem werden.


Zum Beenden von PHP:
In der Schleife also zB. ein sleep(1), ist klar.
Was man aber nicht tun darf, anhand von dem die Zeit messen.
Die eine Millisekunde garantiert zwar, dass etwas gewartet bzw. der Prozessor nicht belastet wird,
aber das können/werden genau gemessen eher Wartezeiten wie 0.4ms oder 2.3ms sein.
sleep uÄ. sind einfach ungenau.

Zum Zeitmessen am Anfang einmal einen Timestamp in eine Variable tun
und dann in der Schleife die Differenz aktuellerTimestamp - Variable nehmen,
um die vergangenen Sekunden zu erhalten.

Und zum exit:
Genau, irgendsowas.
 
Zurück