Daten vom Server zum Client senden?

8

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:

%Vor%

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.

    
razzak 18.04.2013, 16:44
quelle

5 Antworten

5

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.

    
razzak 19.04.2013, 18:38
quelle
4

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 .

    
matthewmatician 18.04.2013 18:59
quelle
1

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:

  1. Abrufen der letzten bekannten Sitzung des Benutzers aus der Datenbank.
  2. Rufen Sie session_close() auf, um die aktuelle Sitzung zu schließen (falls vorhanden).
  3. Rufen Sie 'Sitzungsname ($ sessionId)' mit der Sitzungs-ID auf.
  4. Rufen Sie session_open() auf, um diese Sitzung zu öffnen. $_SESSION sollte mit den Sitzungsdaten gefüllt werden. Sie müssen nichts entserialisieren.
  5. Nehmen Sie Ihre Änderungen an der Sitzung vor.
  6. Rufen Sie 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.

    
jimp 18.04.2013 16:55
quelle
1

Sie könnten eine ajax-Anfrage an ein PHP-Skript erstellen, das nur Daten zurückgibt, wenn neue Daten vorhanden sind. Solange keine neuen Daten vorhanden sind, läuft das Skript solange in einer Schleife, bis es existiert.

    
Simon 18.04.2013 17:00
quelle
0

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 wird

Siehe Link

    
BERGUIGA Mohamed Amine 16.11.2015 09:43
quelle

Tags und Links