2012-12-08 4 views
8

Ich arbeite an einem PHP/MySQL/Javascript basierten Online Schachspiel. Ein Problem, auf das ich gestoßen bin, ist die Möglichkeit, dass ein Benutzer an einem Ende seinen Browser schließt. Gibt es eine Möglichkeit, zuverlässig zu erkennen, ob jemand die Seite leer hat/geschlossen hat?Irgendeine Möglichkeit zu überprüfen, ob jemand seinen Browser mit Javascript/PHP geschlossen hat?

Als zusätzliche Komplikation, unsere Schulserver nicht Cronjobs unterstützen -_-

+4

Kurze Antwort: ** NEIN ** Aber immer noch können Sie in regelmäßigen Abständen ping Benutzer überprüfen –

+1

Beachten Sie, dass dies auf Tatsache beruht, dass Benutzer ** lets ** th Ping weitergehen –

+0

was meinst du mit pingen Benutzer? – user1880610

Antwort

2

Die einzige zuverlässige Möglichkeit, dies zu tun, ist eine Pingen Technik auf Ihren Server zu verwenden, da die anderen commen vorgeschlagen haben. Auf diese Weise steuern Sie das Spiel, nicht die Browser. Die Art und Weise, wie Sie Benutzer "verfolgen" müssen, besteht darin, einen AJAX-Anruf auszulösen ... Ich denke, alle 5 Sekunden reichen oft ... zum Server. Alles, was Sie tun werden, ist entweder etwas in eine "Tracking" -Tabelle einzufügen oder eine neue Spalte in Ihrer "Games" -Tabelle zu aktualisieren, um den letzten Server-Aktivitäten des Benutzers nachzuverfolgen (Ignorieren normaler Bewegungen im Spiel) kann denselben Prozess für normale Bewegungen ausführen und das Ping-Intervall ebenfalls zurücksetzen, um eine übermäßige Überprüfung zu vermeiden. Jedes Mal, wenn ein Benutzer einen Zug macht (oder etwas anderes, das eine Serverinteraktion erfordert), müssten Sie den Zeitpunkt der letzten Serveraktivität des Gegners überprüfen - wenn der Gegner innerhalb von 7 Sekunden nach dem Zug keinen Zug gemacht hat aktuelle Zeit, dann hat der Browser des Gegners aufgehört zu kommunizieren (aus welchem ​​Grund auch immer). Der Grund, warum ich 7 Sekunden sage, liegt an der zusätzlichen Verarbeitung, die für die Server/Datenbank-Kommunikation und für jede mögliche Netzwerkverzögerung stattfindet. Da Netzwerk-Engpass wahrscheinlich der Engpass ist, möchten Sie diesen Wert möglicherweise auf etwa 10 erhöhen.

+0

Vielen Dank für eine angemessene Antwort! Ich habe nicht so viel Gezänk erwartet auf SO- – user1880610

+0

Nun, für eine separate Frage: Diese Lösung ist abhängig von einem Benutzer aktiv sein. Ich habe eine Lobby, in der alle verfügbaren Spiele angezeigt werden. Gibt es irgendeine Möglichkeit, dass der Server herausfinden kann, ob beide Spieler gehen, so dass ich dieses Spiel in meiner Lobby nicht mehr anzeigen muss? Der Mangel an Cron wird hier zum Problem. – user1880610

+0

Dies ist, wo ich nicht einverstanden mit Ihrem Ansatz einfach AJAX für ein Multiplayer-Spiel verwenden. Dies sollte wirklich alles mit Websockets gemacht werden, wo Sie keine Polling und solche Sachen brauchen würden. Cronjobs helfen nicht wirklich (es sei denn, Ihre Lobby-Seite verwendet auch Abfragen, aber dann macht es sie unnötig), weil der Server keine Nachrichten an den Client senden kann. Wie bei der Lösung von AJAX-Polling während des Spiels müssten Sie in Ihrer Lobby so etwas tun. Die Lobby-Seite müsste alle 5 Sekunden wie zuvor abfragen und prüfen, ob beide Benutzer in den letzten 7 Sekunden keine Aktivität hatten – Ian

1

Sie können nicht mit genauer Sicherheit wissen, ob der Client geschlossen ist. Sie können einige qualifizierte Vermutungen anstellen, aber es wird niemals zuverlässig sein.

Vielleicht könnten Sie einen Bereich finden, in dem Sie zufrieden sind, wenn Sie wissen, ob eine Clientsitzung aktiv ist oder nicht?

Eine Low-Tech-Lösung wäre es, die Sitzungs-ID (oder eine selbstgemachte eindeutig identifizierende Zeichenfolge) zusammen mit einem Zeitstempel zu speichern. Wenn der Client eine neue Anforderung (neue Seite laden und/oder mit AJAX) erstellt, aktualisieren Sie den Zeitstempel.

Da Sie keinen Zugriff auf Cronjobs haben, müssen Sie einen weiteren Kompromiss eingehen - lassen Sie die anderen Besucher sagen, ob der Client noch aktiv ist. Wenn ein Besucher eine Seite lädt, durchlaufen Sie die Tabelle, in der die Sitzungs-IDs und Zeitstempel gespeichert sind, und sehen Sie, ob Sitzungen älter als das sind, was Sie als aktiv ansehen würden.

Es ist kein Problem für Ihr genaues Problem (da es nicht möglich ist), sondern ein Low-Tech-Kompromiss.

0

Sie können einfach ein 'RECURSIVE' AJAX-Skript auf dieser Seite und dieses Skript automatisch senden aktualisierte Zeit auf den Server nach kurzer Zeit. Und auf dem Server müssen Sie dieses Request Listener Script schreiben, um diese Details zu protokollieren. Wenn Sie sehen, dass eine Benutzeranfrage abgebrochen wurde oder einige Male nicht als letztes kommt, hat er seinen Browser geschlossen.

Verwandte Themen