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:
- Session-Lebensdauer -> ini
- Session-GC-Wahrscheinlichkeit -> ini
- GC-Triggerung -> Besucher auf der Site
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.
- Wenn es GENAU ein Satz war, ist alles in Ordnung, der User darf
- Wenn es GENAU kein Satz war, ist alles in Ordnung, der User darf nicht
- Wenn es mehr als ein Satz war, sofort System runterfahren, schwerer Fehler
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