Chris: "Wer ist Online?"-Script - Wie realisieren?

Hey ihr,

ich möchte für meine Website (Portal, Eigenentwicklung) eine "Wer ist Online"-Liste erstellen. Allerdings ist mir das Prinzip nicht ganz klar...

Ich könnte bei jedem eingeloggten User eine Info in einer zusätzlichen Tabelle hinterlegen. In dieser werden alle eingeloggten User eingetragen, zusammen mit dem TimeStamp.

Und bei jedem Seitenzugriff wird der TimeStamp erneuert.

Die Frage ist, wie kann ich die User wieder automatisch rauslöschen lassen? Beim Logout wäre es ja möglich... aber manche User schließen auch einfach die Seite, oder stürzen ab oder oder oder... und wie entferne ich die dann aus der Liste?

Bei jedem Aufruf der Website die entsprechende Tabelle prüfen, ob die User noch da sind? (Also den letzten TimeStamp überprüfen) Das würde ja Datenbank-Zugriffe ohne Ende bedeuten... oder einen Cronjob dafür einrichten, der alle 5 Minuten oder so ein "Bereinigungs-Script" aufruft?

Wie macht man sowas normalerweise?

Grüße
Chris

  1. Yerf!

    Bei jedem Aufruf der Website die entsprechende Tabelle prüfen, ob die User noch da sind? (Also den letzten TimeStamp überprüfen) Das würde ja Datenbank-Zugriffe ohne Ende bedeuten...

    delete from tabelle where timestamp älter als 5 minuten (so in etwa)

    Das ist doch nur ein Statement mehr (als das reine Auslesen)? Ich glaube nicht, dass dies ein Problem sein sollte.

    oder einen Cronjob dafür einrichten, der alle 5 Minuten oder so ein "Bereinigungs-Script" aufruft?

    Das halte ich für ein wenig übertrieben nur für so eine Liste.

    Wie macht man sowas normalerweise?

    Ich würde im Session_End() Handler den Eintrag des Benutzers entfernen, aber das ist leider kein PHP sondern ASP.NET...

    Gruß,

    Harlequin

    --
    <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
  2. Hello,

    Wie macht man sowas normalerweise?

    indem man für den Client eine Session startet.
    In der Sessiondatei kann man sich solche Daten merken, wie Usernummer, Username, aktuelle Rechte.
    Um diese nun bei jedem Request zu verifizieren, greift man auf die Anmeldedaten in der Datenbank zu.

    Das ist ein Statement:

    update login
      set lastrequest = now()
      where usernummer = $usernummer and session = session_id()

    Wenn das Query einwandfrei durchläuft, ist der User (noch) berechtigt, weiterzusurfen, sonst hast Du ihm vielleicht schon die Rechte entzogen, indem einfach die Session-ID gelöscht wurde aus der Datenbank und das Flag "enable_login" oder die ausführlicheren Rechte gekippt wurden.

    Die benötigst Du aber nur beim anmelden...

    Wenn Du dann eine Datenbankabfrage machst: "Wer ist Online", dann bedeutet das ja nur, "Wer hat innerhalb der letzten X Minuten einen Request abgesezt"

    Da kannst Du noch sowas wie "aktiv", "schon im Gehen?, und "gegangen" einführen, je nachdem, wann der letzte Request stattgefunden hat.

    Mehr Aussagen kannst Du in einem verbindungslosen Protokoll nicht treffen.

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  3. Hallo Chris,

    ich möchte für meine Website (Portal, Eigenentwicklung) eine "Wer ist Online"-Liste erstellen. Allerdings ist mir das Prinzip nicht ganz klar...

    Zuerst einmal: Lies: http://aktuell.de.selfhtml.org/artikel/programmiertechnik/useronline/

    Dort wird das ganze zwar mit Textdateien gemacht, aber es erläutert ein paar grundsätzliche Konzepte, was vielleicht ganz hilfreich ist.

    Ich könnte bei jedem eingeloggten User eine Info in einer zusätzlichen Tabelle hinterlegen. In dieser werden alle eingeloggten User eingetragen, zusammen mit dem TimeStamp.

    Und bei jedem Seitenzugriff wird der TimeStamp erneuert.

    Wenn Du eine DB verwendest und keine Textdateien, wie in meinem Artikel der Einfachheit halber vorgeschlagen, dann ja.

    Die Frage ist, wie kann ich die User wieder automatisch rauslöschen lassen?

    Du könntest einfach alle Einträge, die älter sind als X automatisch entfernen, d.h. (in MySQL, andere DBMS ähnlich):

    DELETE FROM tabelle WHERE zeitpunkt < DATE_SUB (NOW(), INTERVAL 15 MINUTE)

    In dem Zusammenhang wäre das "Neu-Einfügen" in die DB am einfachsten über REPLACE INTO (wenn Du wie gesagt MySQL verwendest) zu bewerkstelligen:

    REPLACE INTO tabelle (user, zeitpunkt) VALUES ('foo', NOW())

    Das ist dann entweder ein UPDATE oder ein INSERT je nachdem ob schon ein Datensatz existiert oder nicht (die Spalte user muss dann natürlich PRIMARY KEY sein).

    Bei jedem Aufruf der Website die entsprechende Tabelle prüfen, ob die User noch da sind? (Also den letzten TimeStamp überprüfen) Das würde ja Datenbank-Zugriffe ohne Ende bedeuten...

    Nein, das würde genau einen Datenbankzugriff bedeuten. :-)

    oder einen Cronjob dafür einrichten, der alle 5 Minuten oder so ein "Bereinigungs-Script" aufruft?

    Wäre in meinen Augen für so eine Aufgabe kompletter Overkill.

    Viele Grüße,
    Christian