Ich arbeite an einer einfachen Chat-App, wahrscheinlich 10 bis 20 Benutzer pro Zimmer.
Das Skript, das die Datenbank nach neuen Nachrichten abfragt, sieht für alle Anfragen, die es erhalten wird, zu einfach aus.
Unten ist der Codeblock, der nach neuen Nachrichten sucht, der Rest des Skripts erhält nur die Variablen, die Konstruktion der Abfrage und das json response-Objekt:
%Vor%Der obige Block fragt die Datenbank jede Sekunde für 10 Sekunden nach neuen Nachrichten ab, wenn nach 10 Sekunden keine neuen Nachrichten mehr an den Browser gesendet werden. Der Browser wartet 5 Sekunden und sendet dann eine weitere Anfrage um neue Nachrichten zu erhalten.
Wenn das Skript jedoch neue Nachrichten findet, fordert der Browser sofort weitere neue Nachrichten an, sobald er die Antwort mit den neuen Nachrichten vom Server erhält.
Dieser Prozess geht weiter und weiter ...
Wie kann ich diesen Prozess weiter optimieren? Ist das so gut wie es geht? Funktioniert gut auf meinem lokalen Server, aber ich habe Angst, dass nur ein paar Benutzer einen Live-Server (Shared Host) mit allen Anfragen und den Schleifen überlasten könnte.
Hier ist Live-Demo, die Sie mit Firefighter Ссылка
überprüfen könnenAus Ihrer Beschreibung klingt es so, als hätten Sie eine Stille von 5 Sekunden Dauer, die den Vorteil einer langen Umfrage zunichte macht. Lassen Sie den Browser sofort eine weitere Anfrage starten, wenn ein Anruf (lang oder kurz) vom Server zurückkehrt. Zur Sicherung muss der Browser bei jedem Serveraufruf eine Zeitüberschreitung auslösen, die etwas länger ist als die Zeitlimitüberschreitung auf der Serverseite, aber abgebrochen werden, wenn eine Anforderung zurückgegeben wird. Wenn die Serveranfrage immer fehlschlägt und die Browser-Zeitüberschreitung abgeschlossen ist, starten Sie eine neue Anfrage.
Dieser schreit für AJAX.
Siehe meinen Beitrag heute auf how to Senden Sie JavaScript-Antworten an PHP . Es gibt keinen Grund, warum Ihr Skript überhaupt eine Schleife ausführen sollte.
EDIT: Mein schlechtes über den AJAX. Als ich den IRC-Chatbot PHP-Ei geschrieben habe, bin ich auf dieses Problem gestoßen * 100. Wie ich es gelöst habe (zurück in der PHP 4 Tage, wohlgemerkt) war es, pcntl_fork () PHP und einfach zurück zu bekommen jedes Mal gab es eine Nachricht. Die Vorteile sind, dass es die CPU nicht zu 100% blockiert, im Gegensatz zu sleep () und VIEL schneller ist als 10 Sekunden oder ein beliebiges Limit, das man darauf legt.
Ich überarbeite meine Antwort noch einmal (Entschuldigung!):
Verwenden Sie eine Art asynchronen Prozess, der den Text in eine Datei ablegt.
Was Sie dann tun würden, ist
if (filemtime ('chat.log') & gt; time () - 5) { echo json_encode (file_get_contents ('chat.log')); }
Vorteile: Begrenzte SQL-Nutzung; keine Schleife erforderlich.
Ich habe einen Web-Chat gemacht und bin auf die gleiche Lösung gestoßen, um Updates in Echtzeit zu halten. Also, ich frage mich, ob Sie es herausgefunden haben: ist es eine gute Möglichkeit, serverseitig mit der Funktion sleep () zu loopen, oder vielleicht ist es besser, stattdessen mehr Ajax-Abfragen zu verwenden. Und ist die Funktion sleep () wirklich eine gute Idee und wird der Server nicht angehalten, wenn mehrere usres polling sind?
Ich sehe Meebo mit Long-Polling (die Zeit zwischen Abfragen hängt auch vom Fokus des Fensters ab, denke ich) während der SO-Chat-App. scheint nur mit Ajax-Abfragen zu arbeiten. Das wundert mich.
Sie könnten versuchen, Dateien zu verwenden, die nach conversationId anstatt einer DB benannt sind, und nur prüfen, ob die Datei "berührt" wurde. Verwenden Sie außerdem usleep und set_time_limit (für Windows Server), um Ihr Intervall in Millisekunden festzulegen und die Ruhezeit zu erhöhen. Usleep verzögert zwar die CPU-Auslastung, wird jedoch sofort ausgelöst, wenn die Datei geändert wurde.
Hier ist ein Abschnitt meines Chat-Skripts. =)
%Vor%Tags und Links php long-polling chat