Senden von Daten vom server zum client?
Ich habe eine php-Datei-server-und eine client-HTML-Datei, die HTML-Datei senden, ajax Anfragen an den server zum abrufen von Daten jeder 500 ms
diese zwar wie erwartet funktioniert, es verursacht hohe Auslastung von Speicher und CPU-Auslastung auf dem client-Gerät.
PHP
if(isset($_POST['id']) && $_POST['id'] != '' )
{
$id = $_POST['id'];
$select = $con->prepare("SELECT * FROM data WHERE id=?");
$select->bind_param('s', $id);
$select->execute();
$result = $select->get_result();
while($row = $result->fetch_assoc())
{
echo $row['column 1'] . "\t" . $row['column 2'] . "\n";
}
}
AJAX
function send(){
var formdata = new FormData(),
id = document.getElementById('id').value;
formdata.append('id', id);
var xhr = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
xhr.open('post', 'server.php', true);
xhr.send(formdata);
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
console.log(xhr.responseText);
}
}
}
setInterval(function(){send()}, 500);
Ich möchte finden, eine alternative Lösung zu ajax, anstatt zahlreiche Anfragen an den server und das abrufen von gleichen Daten die meisten der Zeit, es wäre viel effizienter, wenn der server Kontakt mit dem client auf die Daten zu ändern oder zu aktualisieren.
Kann ich nicht verwenden, PHP Socket
oder HttpRequest
medthods, da Sie nicht installiert auf meinem hosting-server, und ich bin mir nicht sicher, ob das später funktioniert. Die einzige Möglichkeit, die mir einfällt, ist mit SESSIONS
.
laut diese PHP-server speichern alle Benutzer-Sitzungen auf das gleiche Verzeichnis auf dem server, daher kann es möglich sein, das zu ändern-sessions-Variablen für einen bestimmten Benutzer direkt auf die Datei. das problem ist jedoch, die Daten in diesen Dateien serialisiert werden und ich bin mir nicht sicher, wie Sie Sie zum de-serialisieren der Daten und re-serialisieren und speichern Sie dann die neuen Daten!
Selbst wenn ich in der Lage war, einen Weg zu finden, um Shop-updates auf die session-Datei, ich muss noch mit setInterval hören den session Variablen ändern sich jedes 500ms
es ist zwar nicht ideal, aber es wäre viel besser, als mit XMLHttpRequest
im Bezug auf Speicher und CPU-Auslastung.
Also, was ist der beste Weg, dies zu tun? jede Hilfe wäre sehr geschätzt werden.
UPDATE:
Erkannte ich, dass SESSION
wird nicht funktionieren, weil es kann nur gelesen werden, indem der server den client nicht, deshalb habe ich das senden der ajax-Anfrage an den server, um die Variablen, die ich versucht habe, zu vermeiden.
Ich habe versucht, long-polling, aber ich hatte viele Probleme mit ihm, flush
und ob_flush()
funktioniert nicht auf meinem server und ich kann es nicht ändern, die ini
Einstellungen. Wenn Sie versuchen, die endlos-Schleife, die ich nicht bekommen kann es zu brechen, auf Daten ändern:
if(isset($_GET['size']) && $_GET['size'] != '')
{
$size = (int)$_GET['size'];
$txt = "logs/logs.txt";
$newsize = (int)filesize($txt);
while(true) {
if($newsize !== $size) {
$data = array( "size" => filesize($txt), "content" => file_get_contents($txt));
echo json_encode($data);
break;
}
else{
$newsize = (int)filesize($txt);
usleep(400000);
}
}
}
es läuft weiter und weiter, auch wenn die logs.txt
Erhöhung der Größe wird es nicht brechen! wie kann ich es machen Pause und echo-Daten zu Größe steigern?
UPDATE 2:
es stellte sich heraus das php-cache die Dateigröße beim Aufruf filesize()
Methode daher die obige Schleife wird auf unbestimmte Zeit laufen, ist die Lösung dafür ist die Verwendung clearstatcache()
Methode wich löschen der gespeicherten cache die Größe der Datei, so dass die Schleife zu brechen, auf die Dateigröße ändert.
- Wie Häufig erwarten Sie, dass Ihre response-Daten zu ändern?
- es schwankt, könnte es sein, einmal alle 10 Sekunden oder einmal alle 10 Minuten
- wie groß ist die Ergebnismenge? in kb?
- Wie schnell sollte der Kunde pick-up-änderungen an Daten? Wie viele Sekunden ist akzeptabel?
- Ja, ich habe Fragen über die Häufigkeit der Daten-Updates, da polling jede halbe Sekunde scheint ziemlich extreme.
- die Anforderung ist klein in der Größe weniger als 1kb, @Kami die user erhalten sollten, die updates so schnell wie möglich
Du musst angemeldet sein, um einen Kommentar abzugeben.
Okay, nach vielen tests und langer Forschung kam ich zu dem Schluss, dass der PHP-server, können interagieren nie mit einem bestimmten client direkt, es sei denn, der Kunde senden Sie eine Anfrage an den server.
Die einzige zuverlässige Lösung, die ich fand, ist die Verwendung Endlosschleife, die nur brechen Sie auf Daten ändern, dies reduziert die Häufigkeit von ajax Anfragen an den server erheblich, daher die Erhöhung der Leistungsfähigkeit und eine Verringerung der Nutzung von Speicher und CPU-Auslastung auf dem client-Gerät hier, wie es geht:
PHP 1 (Verarbeitet Daten aktualisiert oder neue Daten einfügen in Datenbank):
Den oben genannten code einfügen/aktualisieren von Daten, erstellen Sie die Datei
log.txt
wenn nicht schon vorhanden, und fügen Sie zusätzlichen text, um es auf jede Anfrage.log.txt
wird später verwendet werden, in die endlos-Schleife "unten" und brechen die Schleife, wenn es die Größe ändern.PHP 2 (Griffe Lesen von Daten Anfragen):
AJAX:
Dies ist nicht die ideale Lösung, aber es reduziert mein xmlhttp-Anfragen von 2/sec so gering wie 1/25 Sek, hoffe, dass jemand in der Lage zu kommen mit eine bessere Lösung.
PHP server can never interact with a specified client directly unless the client send a request to the server first.
das ist, wie HTTP funktioniert. developer.mozilla.org/en-US/docs/HTTPVorher hatten wir Möglichkeiten zu verwenden sockets in Browsern, verwendeten wir Long polling. Die grundlegende Idee ist, dass anstelle der browser-Anforderungen in regelmäßigen Zeitabständen, stellt der browser eine Anfrage an den server, aber der server reagiert nicht, bis da etwas sinnvolles zu teilen an den browser zurück. Das bedeutet, dass die Anforderung konnte offen gelassen werden, für 10ms oder für Stunden.
Nachdem der server antwortet mit etwas, ist es dann die browser-job zu machen, eine neue ajax-request. Auf diese Weise gibt es eine Linie, die auf dem server geöffnet.
Finden diese Frage für weitere Informationen.
Die Beantwortung der Teil Ihrer Frage direkt Bearbeiten einer Sitzung...
Direkt Bearbeiten Sie die Sitzung eines Benutzers, ich nehme an, Sie wissen und können verfolgen, jede user-session-ID (vielleicht in Ihrer Datenbank anmelden).
Wenn Sie brauchen, um einen Benutzer zu Bearbeiten session direkt auf dem server:
session_close()
zum schließen der aktuellen session (wenn es eine ist).session_open()
zu öffnen, die Sitzung.$_SESSION
sollten aufgefüllt werden, mit der die session-Daten. Sie nicht brauchen, um unserialize nichts.session_close()
zu reserialize der Daten.Alternativ können Sie könnte direkt öffnen Sie die session-Datei
unserialize()
es, die Daten Bearbeiten, und re-serialize()
manuell.session
wird nicht funktionieren, weil es kann nur durch das Lesen von server-nicht client, so dass ich Sie schickenxmlhttprequest
zum server und zurück auf Platz eins.Könnte man erstellen Sie eine ajax-Anfrage an ein php-script, das nur Daten zurück, wenn es keine neuen Daten. So lange es keine neuen Daten, die das Skript läuft in einer Schleife, bis Sie es ist.
Ich denke, die anwser für diese Frage ist heute zu verwenden Websocket darüber zu Lesen. ohne Anfrage dem server können Sie die Daten, wenn es etwas ändern Sie es in server
sehen link