Ich bin gerade dabei einen Onlinestatus-Counter zu programmieren.
Habe es auch soweit geschafft, dass alles funktioniert. Nur eben noch nicht ganz so, wie es sein soll.
Deswegen habe ich da auch ein paar Fragen.
Aber erstmal erkläre ich euch, wie ich den Onlinestatus ermittle:
Es gibt da zwei verschiedene. Zum einen der Onlinestatus für die Mitglieder und zum anderen der Onlinestatus für alle Besucher, die auf der Seite online sind.
Der Onlinestatus für Mitglieder arbeitet zusammen mit der MySQL-Datenbank, in der die Mitglieder gespeichert werden.
Das Prinzip funktioniert hier so:
- ein Mitglied loggt sich erfolgreich ein und es wird einer Session mit der User-Id registriert
- der Onlinestatus wird dann auf 1 (= ist online) gesetzt
- zudem wird der aktuelle Zeitstempel + 420 in die Datenbank als "zuletzt_online" eingetragen
- wenn das Mitglied nun 420 Sekunden (7 Minuten) auf der Seite inaktiv ist, dann wird der Onlinestatus automatisch auf 0 (= nicht online) gesetzt
- bei der nächsten Aktivität wieder auf 1 und der Zeitstempel wieder mit + 420 eingetragen
- wenn sich das Mitglied ausloggt, dann wird der Onlinestatus auf 0 gesetzt
So funktioniert es bei dem Mitglied.
Mehr dazu später. Jetzt zum Prinzip der Onlineuser:
- kommt ein Besucher auf die Seite wird die IP-Adresse und der aktuelle Zeitstempel + 120 (2 Minuten) in die Datenbank eingetragen
- ist diese IP-Adresse schon vorhanden (war innerhalb der letzten 2 Minuten auf der Seite), dann wird der alte Datensatz überschrieben und aktualisiert
- sollte der Eintrag älter als 120 Sekunden sein, dann wird der Datensatz gelöscht und der Besucher gilt als offline
Dies sind 2 Funktionen, die so aufgebaut sind:
function mitglieder_online() { db_connect(); $zeitspanne = 420; // Zeitspanne in (Sekunden) für den Onlinestatus // Setzt Onlinestatus auf 0 wenn offline mysql_query("UPDATE mitglieder SET onlinestatus = '0' WHERE zuletzt_online < ".time().""); if(isset($_SESSION['user_id'])) { // Setzt Onlinestatus auf 1 wenn online mysql_query("UPDATE mitglieder SET zuletzt_online = '".(time()+$zeitspanne)."', onlinestatus = '1' WHERE id = '".$_SESSION['user_id']."'"); } // Ermittelt aktive Mitglieder $online_result = mysql_query("SELECT count(*) FROM mitglieder WHERE onlinestatus = '1'"); return mysql_result($online_result, 0); } function user_online() { $zeitspanne = 120; // Zeitspanne (in Sekunden) für den Onlinestatus $user_select = mysql_query("SELECT * FROM user_online WHERE ip = '".get_ip()."'"); mysql_query("DELETE FROM user_online WHERE ablauf < ".time().""); if(mysql_num_rows($user_select) == 1) { mysql_query("UPDATE user_online SET ablauf = '".(time()+$zeitspanne)."' WHERE ip = '".get_ip()."'"); } else { mysql_query("INSERT INTO user_online (ip, ablauf) VALUES ('".get_ip()."', '".(time()+$zeitspanne)."')"); } // Ermittelt aktive User $online_result = mysql_query("SELECT count(*) FROM user_online"); return mysql_result($online_result, 0); }
Mit einem "echo" jeweils, kann man die Anzahl der Onlineuser/Mitglieder ausgeben.
Solltet ihr Fehler in den 2 Funktionen finden oder ihr Verbesserungsvorschläge habt, dann nur her damit
So, diese 2 Funktionen werden auf jeder Seite ausgeführt. Sobald also irgendwo irgendwas getan (geklickt, aktualisiert, Aktion, ...) wird, dann werden die Funktionen überprüft.
Zusätzlich habe ich noch ein iFrame eingebaut, das unsichtbar ist (width="0" height="0") und zu folgender Überprüfungsseite führt:
<?php include('../functions.inc.php'); mitglieder_online(); user_online(); header("Refresh:300"); ?>
Wie ihr seht, wird alle 5 Minuten dieses iFrame aktualisiert und die Funktionen überprüft.
Jetzt weiß ich nicht sicher, ob ich diese Überprüfung überhaupt brauche. So kann ich mir halt sicher gehen, dass alle 5 Minuten der Onlinestatus überprüft und ggf. geändert wird.
Eigentlich passiert das ja auch mit irgendeinem Handeln auf der Seite (weil die Funktionen ja global aufgerufen werden).
Jetzt zu meinen Fragen:
1.) Brauche ich das iFrame überhaupt, dass die Funktionen alle 5 Minuten auf den Onlinestatus überprüft? Oder würdet ihr sagen, dass die Funktionen auf jeder Seite ausreichen, denn sobald etwas getan wird passiert auch damit etwas.
2.) Kann ich irgendeine andere Lösung für die Überprüfung dieser Funktionen finden? Dass ich sie also nicht global auf jeder Seite aufrufen muss und auch das iFrame weglassen kann?
3.) Ihr habt oben ja die Funktionen... Nur kommt mir da irgendwas komisch vor. Wie ihr wisst, werden alle 5 Minuten die Funktionen überprüft und die Datenbank aktualisiert. Bei der Funktion user_online(); wird nun immer beim Aufrufen der Funktion der Datensatz für den letzten Zeitstempel + 120 aktualisiert. Das ist auch gut so, denn dann hat man immer den richtigen und aktuellsten Status des Besuchers. Bei der anderen Funktion mitglieder_online();
ist das aber nicht mehr der Fall. Hier wird nur durch eine Aktion (irgendein Handeln auf der Seite) der Datensatz für "zuletzt_online" aktualisiert. Könnt ihr euch vorstellen warum? Ich finde das Problem nicht...
4.) Würdet ihr diese Idee von mir als schlecht oder als gut einstufen? Ist es sehr Serverlastig, dass so oft und so viel in der Datenbank geändert wird? Was würdet ihr denn anders machen?
Ich wäre euch sehr dankbar, wenn ihr mir behilflich sein könnt
Danke schon mal im Voraus!
Grüße,
Slayer.
Dieser Beitrag wurde von Slayer bearbeitet: 08. Juni 2005 - 20:45