Ich habe eine PHP-Server-Datei und eine HTML-Client-Datei, die HTML-Datei senden Ajax-Anforderungen an den Server, um alle 500 ms
Daten abzurufen, dies funktioniert zwar wie erwartet, verursacht aber eine hohe Auslastung von Arbeitsspeicher und CPU auf dem Client-Gerät.
PHP
%Vor%AJAX
%Vor%Ich würde gerne eine alternative Lösung für ajax finden, anstatt mehrere Anfragen an den Server zu senden und die gleichen Daten die meiste Zeit zu erhalten, wäre es viel effizienter, wenn der Server mit dem Client bei Datenänderungen oder -aktualisierungen interagieren könnte .
Ich kann PHP Socket
oder HttpRequest
medthods nicht verwenden, da sie nicht auf meinem Hosting-Server installiert sind und ich bin mir nicht sicher, ob das später funktioniert. Die einzige Möglichkeit, die ich mir vorstellen kann, ist die Verwendung von SESSIONS
.
nach dieser PHP-Server speichert alle Benutzersitzungen In demselben Verzeichnis auf dem Server kann es daher möglich sein, Sitzungsvariablen für einen bestimmten Benutzer direkt in der Datei zu ändern. Das Problem ist jedoch, dass die Daten in diesen Dateien serialisiert sind und ich nicht sicher bin, wie man die Daten deserialisiert und sie erneut serialisiert und dann die neuen Daten speichert!
Auch wenn ich einen Weg gefunden habe, Updates in der Sitzungsdatei zu speichern, muss ich setInterval trotzdem verwenden, um die Änderung der Sitzung zu beobachten, jedes 500ms
, obwohl es nicht ideal ist, aber es wäre viel besser als XMLHttpRequest
in Bezug auf Speicher und CPU-Auslastung.
Was ist der beste Weg, dies zu tun? jede Hilfe würde sehr geschätzt werden.
UPDATE:
Ich habe festgestellt, dass SESSION
nicht funktioniert, weil es nur vom Server und nicht vom Client gelesen werden kann. Daher muss ich eine ajax-Anfrage an den Server senden, um die Variablen zu erhalten, die ich vermeiden wollte.
Ich habe lange Abfragen versucht, aber ich hatte viele Probleme damit, flush
und ob_flush()
funktionieren nicht auf meinem Server und ich kann die ini
Einstellungen nicht ändern. Wenn ich die Endlosschleife ausprobiere, kann ich nicht erreichen, dass sie bei Datenänderungen bricht:
Es geht weiter und weiter, auch wenn die logs.txt
-Größe steigt, wird es nicht brechen! Wie kann ich es brechen und echo Daten über die Größe erhöhen?
UPDATE 2:
Es stellte sich heraus, dass der PHP-Cache die Dateigröße beim Aufruf von filesize()
method verwendet. Daher wird die oben genannte Schleife unbegrenzt laufen. Die Lösung hierfür ist clearstatcache()
method, die den gespeicherten Cache der Dateigröße löscht Änderungen der Dateigröße unterbrechen.
Okay, nach vielen Tests und langen Recherchen kam ich zu dem Schluss, dass der PHP-Server niemals direkt mit einem bestimmten Client interagieren kann, es sei denn, der Client sendet zuerst eine Anfrage an den Server.
Die einzige zuverlässige Lösung, die ich gefunden habe, ist die Verwendung der Endlosschleife, die nur bei Datenänderungen bricht. Dadurch wird die Häufigkeit von AJAX-Anfragen an den Server erheblich reduziert, was die Leistung erhöht und die Nutzung von Speicher und CPU verringert Client-Gerät, hier, wie es geht:
PHP 1 (Handles Datenaktualisierung oder neue Daten einfügen in die Datenbank):
%Vor% Der obige Code fügt Daten ein / aktualisiert sie, erstellt die Datei log.txt
falls nicht vorhanden und fügt bei jeder Anfrage zusätzlichen Text hinzu. log.txt
wird später in der Endlosschleife "unten" verwendet und würde die Schleife unterbrechen, wenn sich die Größe ändert.
PHP 2 (behandelt Lesen von Datenanforderungen):
%Vor%AJAX:
%Vor%Dies ist nicht die ideale Lösung, aber es reduziert meine xmlhttp-Anfragen von 2 / Sek. auf so niedrig wie 1/25 Sek. Ich hoffe, dass jemand in der Lage sein wird, eine bessere Lösung zu finden.
Bevor wir Sockets in Browsern verwenden konnten, haben wir Long polling verwendet. Die Grundidee ist, dass der Browser, statt dass der Browser in regelmäßigen Abständen Anfragen sendet, eine Anfrage an den Server stellt, aber der Server wird nicht antworten, bis es etwas gibt, das es wert ist, zurück an den Browser zu senden. Das bedeutet, dass die Anfrage für 10ms oder Stunden offen bleiben kann.
Nachdem der Server mit etwas reagiert hat, ist es die Aufgabe des Browsers, eine neue Ajax-Anfrage zu machen. Auf diese Weise ist immer eine Leitung für den Server geöffnet.
Weitere Informationen finden Sie in diese Frage .
Beantworten des Teils Ihrer Frage zum direkten Bearbeiten einer Sitzung ...
Um die Sitzung eines Benutzers direkt zu bearbeiten, gehe ich davon aus, dass Sie die Sitzungs-ID eines Benutzers kennen und verfolgen können (möglicherweise in Ihrer Datenbank bei der Anmeldung).
Wenn Sie die Sitzung eines Benutzers direkt auf dem Server bearbeiten müssen:
session_close()
auf, um die aktuelle Sitzung zu schließen (falls vorhanden). session_open()
auf, um diese Sitzung zu öffnen. $_SESSION
sollte mit den Sitzungsdaten gefüllt werden. Sie müssen nichts entserialisieren. session_close()
auf, um die Daten zu reserialisieren. Alternativ können Sie direkt die Sitzungsdatei öffnen, unserialize()
it, die Daten bearbeiten und serialize()
manuell aktualisieren.
Ich denke, der Anwser für diese Frage ist heute, Websocket darüber zu lesen. ohne Anfrage kann der Server Daten erhalten, wenn etwas in den Server
geändert wirdSiehe Link
Tags und Links php session ajax performance