Frage

Ich mache Änderungen an ein Mitglied-basierte Website, deren Eigentümer will in der Lage sein, Zeit vor Ort (Login / Logout) für alle Benutzer in einem DB-Backend ausgegeben zu verfolgen. Anmeldung ist einfach; es gibt einen Eintrittspunkt (das Anmeldeformular) und als Ergebnis Anmeldungen können so schnell in der Datenbank geworfen werden, wie sie geschehen.

Abmeldungen sind jedoch ein bisschen schwieriger, als es sei denn, die ‚Logout‘ Benutzer klickt auf ausdrücklich lassen Sie uns wissen, dass sie verlassen die Lösung haariger wird (und wie oft Benutzer wirklich auf logout? ). Eine Möglichkeit (nur in Bezug auf die auf der Website Gesamtzeit-Tracking) wäre jede Pageload in der Datenbank registrieren und verbinden sie mit dem Benutzer, der sie geladen; das Problem dabei ist, dass die Website eine Mitgliedschaft basierende Video-Delivery-Website (nicht was Sie denken!) und der letzte Seitenzugriff wird wahrscheinlich ein zwanzig oder dreißig Minuten-Video sein wird. Wir müssen diese Zeit auf dieser letzten Seite, wie gut angelegte erfassen -. Nicht nur die Zeit, die geladen wurde

Ich habe gedacht, von zwei möglichen Lösungen, von denen keines das alles elegant ist. Die erste zu stoppen all ‚Entladen‘ Ereignisse über Javascript wäre und einen Aufruf an ‚logout.php‘ registrieren (dies das XMLHttpRequest unter der Annahme, oder was auch immer nicht stirbt, sobald die Seite geladen ist); das Problem besteht, dass interne Links auch als Entlastungs Ereignisse registrieren, so dass jeder Link würde abmelden den Benutzer (Sie könnten ein Flag in der ‚Entladen‘ Handler zu überprüfen und haben alle internen Links, die Flag gesetzt - nicht schwer zu tun dynamisch, aber ein bisschen kludgy). Der andere Ansatz würde bedeuten, ein Intervall Einstellen der DB alle 60 s ping oder so, die uns wissen lässt, dass der Benutzer immer noch auf der Seite ist, und dann etwas Mathematik zu tun, wenn der Benutzer die Geschichte ziehen die Gesamtlänge dieser Sitzung, um herauszufinden, ; das scheint auch irgendwie hackish. keine dieser Lösungen auch arbeiten für Benutzer mit JS deaktiviert.

Es scheint, dass dieses Problem nicht so ungewöhnlich ist, und es muss ein besserer Weg sein; ist es, dies zu lösen, ein Ansatz Best Practices? Wenn nicht, sehen Sie jede mögliche Weise eine dieser Lösungen zu verbessern?

War es hilfreich?

Lösung

Die Bahn nicht gebaut wird, eine genaue Überwachung der Abmelde-Ereignisse zu ermöglichen. Sie sind einfach nicht bekommen Mitteilung vom Browser garantiert, wenn der Benutzer beendet wird, so unter normalen Umständen die beste Sie das Session-Timeout-Ereignis für ist zu stoppen hoffen können, und das Ereignis möglicherweise nicht bis 20 Minuten Feuer, nachdem der Benutzer die Seite verlassen .

Nun könnte man auf dies ein wenig verbessern, indem eine Ajax-Anforderung in einem Timer auf jeder Seite (vielleicht einmal oder zweimal pro Minute) setzt einen „Herzschlag“ liefern, aber das hat auch einige Einschränkungen: Sie müssen sicherstellen, wird die Sitzung noch schließlich Timeout und Sie werden garantiert noch nicht, dass der Benutzer diese Anforderungen nicht blockieren, vielleicht durch Javascript deaktiviert wird.

Andere Tipps

Ich habe mit der Verwendung von Timer in Javascript guten Erfolg hat, den Server pingen. In meinem Fall erfordert die Site Javascript so dass dies kein Problem ist. Ich habe auch diesen Mechanismus verwenden, um eine Überprüfung durchführen, die ein einziges Konto verhindert, dass zwei verschiedene Maschinen angemeldet aus ist, so gibt es mehr zwingende Gründe, diesen Hack zu tun.

Eine Sache, mit Entladen im Auge zu behalten ist Sie noch nicht guarenteed dass das Unload-Ereignis wird immer ausgelöst werden. Sie werden die Menschen auf Laptops, die zum Beispiel nur den Laptop schließen, so dass der Timer Ansatz probally ein bisschen genauer sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top