Server durch Ajax Chat belastet, was tun?

aargau

Erfahrenes Mitglied
Ich bin gerade daran ein kleinen Chat zu schreiben. Ansich sehr einfach aufgebaut.
1. Request (alle 3sekunden) für die Userliste und ein request pro Sekunde für die neusten Nachrichten.
PHP mässig läuft das ganze über eine mysql Tabelle ab was auch Problemlos laufen würde.
Nun habe ich gestern einfach mal spasses halber die Requests auf 0.5sek userlist und 0.1sek Nachrichten gesetzt und auf zwei Clients geöfnet. Siehe da, der Apache braucht schon 30% CPU last was extrem ist für 2 Clients bzw. ca 20 unter normalen bedingungen.
Etwas optimieren konnte ich das ganze in dem ich die Chat Funktionen in ein externes File ausgelagert habe und nicht alle Funktionen der Seite (ca 10 000 PHP Zeilen) gelesen habe bei jedem Request. Das hat dann noch ca 17% last ergeben -> immer noch viel zu viel für einen Chat!

Nun habe ich heute Testweise mal versucht ohne Ajax zu Arbeiten und mit einer offenen Verbindung und einer Whileschlaufe das selbe zu Simulieren. Man glaubt es kaum aber sogar bei 0.001 Sek. Aktuallisierung braucht der Server nicht mehr als 5% CPU last und der RAM stieg auch kein MB an. Was noch dazukommt: Ich habe das ganze auf 3 verschidenen Browser gleichzeitig geöfnet, heisst also 3fach so viel Arbeit für den Server!

Für mich ist also klar das die Last durch die Requests produziert wird und nicht durch das eigentliche Script. Gibt es nun eine möglichkeit Ajax mit offenen Verbindungen irgend wie so hinzubiegen das es läuft, oder könnte ich ev. Apache noch optimieren damit das ganze besser läuft?
 
Die Stichworte lauten long polling, Comet oder bei modernen Browsern auch Websockets.

Ansonsten solltest du dir überlegen, ob du wirklich eine (MySQL) Datenbank benutzen willst. Das ist für einen Chat denkbar ungeeignet. Die Daten sollten eher im Speicher gehalten werden und wenn man wirklich Persistenz braucht, dann ab und zu im Hintergrund in die Datenbank geschrieben werden.

Edit: Falls es dir nicht um den Lerneffekt geht, sondern du das Produktiv einsetzen willst, könntest du auch darüber nachdenken ein System zu benutzen, dass dafür ausgelegt und erprobt ist. Beispiel: http://www.beaconpush.com/
Oder wenn du es auf eigenen Server laufen haben willst, kannst du dir mal http://www.ape-project.org/ angucken.
 
Zuletzt bearbeitet:
Vielen Dank für deine Hilfe.
Das "ling polling" scheint eine Lösung zu sein, ich dachte eben das der IE Probleme mit offnen Verbindungen und Ajax hat, scheint aber so lösbar zu sein.
Theoretisch könnte ich ja sogar für die Browser welche offene Verbindung mit gepushten Nachrichten unterstützen direkt so arbeiten und nur für den IE den umweg über eine neuanfrage wenn etwas ausgegeben wird machen.

Das ganze soll schon Produktiv eingesetzt werden, für die Entwicklung habe ich aber noch lange Zeit, somit kann ich also das ganze auch austesten.

Die Datenbank verwende ich weil ich so oder so bei jedem neun eintrag eine Query absetzen muss um zu checken ob der User überhaupt (noch) das recht dazu hat.
Da Apache unter Windows wohl keine möglichkeit bietet direkt in den RAM zu schreiben kann ich es praktisch nicht anders testen.
 
Wie prüfst du denn, ob der Nutzer noch das Recht dazu hat? Das sollte doch ohne Query über die Session möglich sein. Ich würde dann den umgekehrten weg gehen. Sobald ein Ereignis passiert, welches verursacht, dass der Nutzer nicht mehr das Recht hat (Logout, Ban), dann setzt du im Speicher ein Flag und prüfst lieber dieses anstatt ständig MySQL damit zu belästigen.

Und das RAM-Problem könntest du z.B. mit Memcached lösen. Aber ob du dort mit Windows viel Spaß haben wirst, weiß ich nicht.
 
Ansonsten solltest du dir überlegen, ob du wirklich eine (MySQL) Datenbank benutzen willst. Das ist für einen Chat denkbar ungeeignet. Die Daten sollten eher im Speicher gehalten werden und wenn man wirklich Persistenz braucht, dann ab und zu im Hintergrund in die Datenbank geschrieben werden.

Hallo,

ich habe ein ganz anderes Problem, dieser Beitrag könnte mir aber helfen, wenn Du mir erzählst ob das möglich ist:

Ich möchte in einem PHP-Skript eine Variable in den Speicher legen und im nächsten Skript diese Variable nutzen. Habe ich Speicherzugriff in PHP? Gibt es eine Möglichkeit den Speicher zu beschreiben und auszulesen?

Gruß
Kalle
 
Hallo Kalle

Mit einem Linux Server Funktioniert dies eigentlich Problemlos, habe ich selbst auch schon getestet, hingegen unter Windows hat mein Script dann nicht mehr Funktioniert. Wie es mit Sharedhosting aussieht kann ich dir auch nicht sagen.

Klappen müsste es mit:
http://ch.php.net/manual/de/book.shmop.php
 
Zurück