Erstmal danke für den schnellen Feedback von euch allen. Jetzt bin ich erstmal schlauer...
Wer das Gerücht in die Welt gesetzt hat, es gäbe ein Eventhandler "onclose", der gehört bestraft!
Jedenfalls werde ich mich mit dem Session-Timeout begnügen müssen.
Das Ganze funktioniert im Moment so:
Ein User loggt sich ein, PHP-Session wird in der DB mit der USERID zugeordnet und in die Tabelle sessions
mit einem DATETIME-Wert der letzten Aktion gespeichert.
Solange er surft wird bei jedem Request (auch bei einem Ajax-Request, welches alle 20 sec die Anzahl der neuen Nachrichten prüft) aktualisiert.
Schließt der User das fenster, wird dieser Zeitstempel nicht aktualisiert. Bei jedem Klick eines anderen Users, wird die komplette Tabelle sessions
gepürft, ob dort abgelaufene Sessions drin sind. Die Lifetime ist gleich die Lifetime wie sie im GC in der php.ini konfiguriert ist. Klickt also ein beliebiger User, so ist dieser dran Schuld, dass die abgelaufenen Sessions der User raus gehauen wurden!
Leider habe ich noch ein Bug:
Wenn der User das Fenster schließt, killt der Browser das SESSION-COOKIE. So muss er sich neu einloggen, die Session von vorher ist aber noch gültig. Egal mit welchem User er sich dann einloggt und obwohl der COOKIE tot ist bekommt der User die gleiche SESSION-ID wieder. Wenn er sich jetzt einloggt, so müsste eigentlich die USERID in der Tabelle sessions
der DB für diese Session aktualisiert werden, sonst erscheint er User offline, obwohl er sich eingeloggt hat.
Ich weiß nicht wieso der User nach dem Schließen des Fensters ausgeloggt ist, obwohl ich das Javascript zum Ausloggen deaktiviert habe. Die SESSION wird aber mit der gleichen SESSION-ID wieder aufgefrischt sobald der User sich wieder einloggt - was er auch mit einem anderen Akkount tun könnte, wenn er mehrere hat!