WinFuture-Forum.de: [php/mysql] Onlinestatus/counter Ermitteln - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

[php/mysql] Onlinestatus/counter Ermitteln


#1 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.476
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 08. Juni 2005 - 20:02

Hallo zusammen.

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 :P
Danke schon mal im Voraus!

Grüße,
Slayer.

Dieser Beitrag wurde von Slayer bearbeitet: 08. Juni 2005 - 20:45

Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

Anzeige



#2 Mitglied ist offline   Floele 

  • Gruppe: aktive Mitglieder
  • Beiträge: 919
  • Beigetreten: 22. Juni 04
  • Reputation: 0

geschrieben 08. Juni 2005 - 20:36

Zitat

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?


Das mit dem iFrame vergiss besser mal. Eigentlich würde das nur dann ein genaueres Ergbenis brigen wenn der Benutzer 5 Minuten lang nichtstuend eingeloggt bleibt, aber für diesen Fall muss man nun wirklich kein Iframe einbauen. Globaler Aufruf reicht.

Dieser Beitrag wurde von Floele bearbeitet: 08. Juni 2005 - 20:36

0

#3 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.476
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 08. Juni 2005 - 20:40

Okay, das dachte ich mir nämlich auch schon, nur wollte ich sicher gehen <_<
Dann mache ich das iFrame wieder raus.
Gibt es denn keine sonstige Möglichkeit, dass es die Datensätze immer überprüft und ggf. ändert?
Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

#4 Mitglied ist offline   Floele 

  • Gruppe: aktive Mitglieder
  • Beiträge: 919
  • Beigetreten: 22. Juni 04
  • Reputation: 0

geschrieben 08. Juni 2005 - 20:42

Naja, ein Seitenaufruf reicht doch. Anders kann es bei HTTP wohl kaum funktionieren.
Zuviel Datenverkehr sollte das ohne Iframe eigentlich nicht verursachen, so ein paar kleine Checks muss MySQL ohne Probleme bewältigen können <_<
0

#5 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.476
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 08. Juni 2005 - 20:49

Alles klar, okay.
Damit wären Punkt 1 - 3 geklärt.

Gibt es sonst noch etwas zu bemengeln oder fällt jemand was auf?
Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

#6 Mitglied ist offline   Yalamand 

  • Gruppe: aktive Mitglieder
  • Beiträge: 101
  • Beigetreten: 19. Mai 05
  • Reputation: 0

geschrieben 08. Juni 2005 - 20:58

Zitat (Slayer: 08.06.2005, 21:49)

Alles klar, okay.
Damit wären Punkt 1 - 3 geklärt.

Gibt es sonst noch etwas zu bemengeln oder fällt jemand was auf?
<{POST_SNAPBACK}>



wer bemängelt denn <_< wofür brauchst du denn die counter tabelle auf die du das update fährst?
0

#7 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.476
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 08. Juni 2005 - 21:05

Zitat (Yalamand: 08.06.2005, 21:58)

wofür brauchst du denn die counter tabelle auf die du das update fährst?
<{POST_SNAPBACK}>

Welche "Counter"-Tabelle und welches Update?
Bisschen genauer bitte <_<
Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

#8 Mitglied ist offline   Yalamand 

  • Gruppe: aktive Mitglieder
  • Beiträge: 101
  • Beigetreten: 19. Mai 05
  • Reputation: 0

geschrieben 08. Juni 2005 - 21:15

Zitat (Slayer: 08.06.2005, 22:05)

Welche "Counter"-Tabelle und welches Update?
Bisschen genauer bitte <_<
<{POST_SNAPBACK}>


Ich verwechsle schon die Threads, entschuldige... ich meine die Tabelle aus [Counter Mit Ip-sperre]
0

#9 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.476
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 08. Juni 2005 - 21:22

Zitat (Yalamand: 08.06.2005, 22:15)

Ich verwechsle schon die Threads, entschuldige... ich meine die Tabelle aus [Counter Mit Ip-sperre]
<{POST_SNAPBACK}>

Achso <_<
Keine Ursache, sowas kann passieren bei all diesen Threads hier gerade von mir :P

Aber du hast sonst nichts eventuell zu verbessern in dem Code oben?
Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

#10 Mitglied ist offline   Yalamand 

  • Gruppe: aktive Mitglieder
  • Beiträge: 101
  • Beigetreten: 19. Mai 05
  • Reputation: 0

geschrieben 08. Juni 2005 - 21:31

Zitat (Slayer: 08.06.2005, 22:22)

Achso <_<
Keine Ursache, sowas kann passieren bei all diesen Threads hier gerade von mir :P

Aber du hast sonst nichts eventuell zu verbessern in dem Code oben?
<{POST_SNAPBACK}>


also wenn du mich so fragst *g*

 $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)."')");
 }


ACHTUNG: erst ein SELECT auf user_online, dann ein DELETE aus gleicher Tabelle kann zu problemen führen. Erst löschen, dann SELECT würde ich vorschlagen.

Läßt es sich nicht einfacher machen? z.B.

mysql_query('DELETE FROM user_online WHERE ablauf < UNIX_TIMESTAMP()');
$result = mysql_query('REPLACE INTO user_online SET ip = '.get_ip().', ablauf = UNIX_TIMESTAMP() + '.$zeitspanne);


Achtung: Dies geht nur wenn die Spalte IP PRIMARY ist! Wenn nicht vorhanden wird ein neuer Datensatz hinzugefügt, wenn vorhanden wird der bisherige gelöscht und ein neuer eingefügt. Aber auch nur wenn die PRIMARY-Spalte (IP) bereits vorhanden ist.

Dieser Beitrag wurde von Yalamand bearbeitet: 08. Juni 2005 - 21:32

0

#11 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.476
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 08. Juni 2005 - 21:36

OK habe SELECT und DELETE vertauscht.

Hm das ist dann aber nicht genau das was ich will, wenn ich es so mache. Weil es sollen ja mehrere Datensätze in der Tabelle user_online sein können.
Aber danke trotzdem <_<
Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

#12 Mitglied ist offline   Yalamand 

  • Gruppe: aktive Mitglieder
  • Beiträge: 101
  • Beigetreten: 19. Mai 05
  • Reputation: 0

geschrieben 08. Juni 2005 - 21:37

Zitat (Slayer: 08.06.2005, 22:36)

Weil es sollen ja mehrere Datensätze in der Tabelle user_online sein können.
Aber danke trotzdem <_<
<{POST_SNAPBACK}>


mehrere datensätze für eine ip?

Dieser Beitrag wurde von Yalamand bearbeitet: 08. Juni 2005 - 21:38

0

#13 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.476
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 08. Juni 2005 - 21:42

Zitat (Yalamand: 08.06.2005, 22:37)

mehrere datensätze für eine ip?
<{POST_SNAPBACK}>

Nein, das nicht.
Aber dein Code ist doch dann auch nicht viel leichter als meiner und dann muss ich das Feld "ip" auch noch PRIMARY machen <_<
Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

#14 Mitglied ist offline   Yalamand 

  • Gruppe: aktive Mitglieder
  • Beiträge: 101
  • Beigetreten: 19. Mai 05
  • Reputation: 0

geschrieben 08. Juni 2005 - 21:46

Zitat (Slayer: 08.06.2005, 22:42)

Nein, das nicht.
Aber dein Code ist doch dann auch nicht viel leichter als meiner und dann muss ich das Feld "ip" auch noch PRIMARY machen :P
<{POST_SNAPBACK}>


ja, das ist ja der trick daran <_<

Tabelle könnte so aussehen:
ip > INT(11) > PRIMARY
ablauf > INT(11)

Dadurch das ip PRIMARY ist darf jede IP nur einmal vorkommen.
ein REPLACE INTO mit dem Wert SET ip = heisst für MySQL also:

Gibt es IP schon? Wenn ja, lösche genau diesen Eintrag, denn es darf ja nur einmal existieren da PRIMARY. Dann füge den neuen ein, mit den gesetzten Werten von SET

Gibt es die IP noch nicht? Dann füge einfach einen neuen ein.
0

#15 Mitglied ist offline   Slayer 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.476
  • Beigetreten: 12. Dezember 03
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Baden-Württemberg
  • Interessen:&gt; Internet<br />&gt; Musik<br />&gt; Filme<br />&gt; Events

geschrieben 08. Juni 2005 - 21:50

Aha OK das klingt ja schon besser <_<
Kann mein ip-Feld aber auch VARCHAR sein und PRIMARY?

Aber was ändert sich da zu meinem Code großartig von dem Aufwand her?

  if(mysql_num_rows($user_select) == 1)
  {
 	 mysql_query("UPDATE user_online SET ablauf = '".(time()+$zeitspanne)."' WHERE ip = '$ip'");
  }


Oder ersetzt dein Beispiel auch den Fall, falls nichts vorhanden ist? Also noch folgendes:

mysql_query("INSERT INTO user_online (ip, ablauf) VALUES ('$ip', '".(time()+$zeitspanne)."')");

Der Mensch hat drei Wege, klug zu handeln.
Erstens durch Nachdenken: Das ist der Edelste.
Zweitens durch Nachahmen: Das ist der Leichteste.
Drittens durch Erfahrung: Das ist der Bitterste.

(Konfuzius)
0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0