Online-check bei Community
Chris
- php
0 Christian Seiler0 Tom
Hallo zusammen,
ich bastle gerade an einer Community Seite und überdenke einen Online Check.
Ich habe mir überlegt die Sessions in ein Verzeichniss zu speichern und beim Login die SessionID in einer DB zu speichern.
An den stellen wo ich den Usern zeigen möchte wer Online ist hole ich mir dann die ID vom jeweiligen user und teste ob die Session noch auf dem Server liegt.
Dann sollte ich ja wissen das er Online ist oder Online war, vor geringer Zeit, sich aber nicht ausgeloggt hat.
... Würdet Ihr das auch so machen?
Oder habt Ihr eine bessere Idee wie ich sowas umsetzen kann ...
Hallo Chris,
Oder habt Ihr eine bessere Idee wie ich sowas umsetzen kann ...
Eine Anzeige der "Users Online" ist letztendlich nicht möglich. Dazu habe ich einen Artikel geschrieben: http://aktuell.de.selfhtml.org/artikel/programmiertechnik/useronline/index.htm Deine Methode ist vom Prinzip her die einzige Möglichkeit, auch nur einen angenäherten Wert zu bekommen. (wenn man den mal definiert hat, was überhaupt 'Online' bedeutet)
Viele Grüße,
Christian
Hallo Chris,
wenn Du mit PHP und den automatischen Sessions arbeitest, dann kannst Du DIch nicht darauf verlassen, dass die Sessiondatei innerhalb einer festen Zeit (der Untätigkeit) gelöscht wird. Das ist von drei Faktoren abhängig:
Es kann durchaus passieren, dass eine Session-Datei noch 24 Stunden später auf dem Server liegt, wenn dieser z.B. wenig PHP-Traffic hat und die Wahrscheinlichkeit niedrig eingestellt ist, weil man dachte, dass der Traffic hoch wird...
Wenn man eine Wahrscheinlichkeit von 1 einstellt, und hat dann tatsächlich einen hohen Traffic, würde der Garbage Collector bei jeder PHP-Nutzung anspringen und das Filesystem damit dicht machen.
Eine bessere Lösung ist der Eintrag des "Last-Click" des Users in die Login-DB. Man kann das gleichzeitig als zusätzliches Sicherheitsfeature nutzen.
Statt dass man SELECT aufruft, ob der User/Passwort-Satz vorhanden ist, nutzt man einfach
Update LOGINTABLE where USER=$user and PASSWORD=$password and SESSION=$sid and GRANTLEVEL>=$grantlevel set LASTCLICK=now();
Danach fragt man ab, wieviele Sätze betroffen waren.
LOGINTABLE Tabelle mit den Logindaten
USER Nickmane / Loginname
PASSWORD i.d.R. md5-Passwort
GRANTLEVEL aktuelle Userrechte
SESSION Nummer der aktuellen Session
LASTCLICK Timestamp oder Datetime des letzten Zugriffs
Man sollte diese Prüfung bei jedem Skriptaufruf durchführen. Das hat den Vorteil, dass man einen User z.B. über den GRANTLEVEL auch während seiner Session rausschmeißen kann.
Beim Aufbau der Session wird die Sessionnummer in die Userdatei eingetragen und die Userdaten beschafft.
Wenn man nun wissen will, wieviele User "Online" sind, kann man einfach ein SELECT auf das LASTCLICK-Feld des LOGINTABLE absetzen.
Je nachdem, wie eng man die Kriterien einstellt, kann man so feststellen, welche User innerhalb der letzten Sekunden, Minuten, Stunden tätig waren.
Der Vorteil dieses Verfahrens ist, dass man Identifikation des Users und Online-Vermerk nur ein SQL-Statement benötigt.
Es geht natürlich auch anders.
Grüße
Tom