Suchen
Inside Wiki
Nützliche Links




 
phpforum.de bei Facebook
 
phpforum.de bei Twitter
 

Zurück   PHP Forum: phpforum.de > phpforum.de Wiki > phpforum.de Wiki

PHP Wiki Dieses Wiki sammelt Lösungen, zu Problemen, welche immer wieder im Forum auftauchen.

 
 
Artikel-Optionen Ansicht
  #1  

Standard User Online Anzeige

 

 

Tutorials - Inhalte

Aufgabe


Zeigen, welche User gerade Online sind. Also angemeldet und auf der Seite aktiv. Eine übliche Funktion in Internet Communities. Auch in diesem Form gibt es eine solche Funktion.

Der goldene Weg


In diesem Tutorial gehe ich mal davon aus, dass ein Benutzerlogin auf MySQL Basis verwendet wird. Das Prinzip läßt sich recht einfach auf ein anderes Datenbank System übertragen.

Voraussetzungen


Ein funktionierendes Loginsystem, welches nur um diese Funktion bereichert werden soll.
Die Usertabelle "users" hat mindestens folgende Felder:
  • user_id - Die User id, meist auto_increment
  • user_name - Der name oder Nick des Users
Die UserID halten wir nach einem erfolgreichen Login in $_SESSION['userid'].

Erweiterung


Für unsere User-Online-Anzeige fehlt in der Tabelle noch ein Feld "last_hit" vom Type DATETIME oder TIMESTAMP. Es wird der Performance förderlich sein, wenn man "last_hit" mit einem Index versieht.
Unsere Tabelle sieht jetzt also mindestens so aus:
Code:
CREATE TABLE `users` (
  `user_id` int(11) NOT NULL auto_increment,
  `user_name` varchar(40) NOT NULL,
  `last_hit` datetime NOT NULL,
  PRIMARY KEY  (`user_id`),
  UNIQUE KEY `user_name` (`user_name`),
  KEY `last_hit` (`last_hit`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;


Bei jedem Request, also bei jeder Aktion des Users erneueren wir den "last_hit".
PHP Quellcode:
if(!empty($_SESSION['userid']))
{
  $sql = "  UPDATE `users`
              SET `last_hit`  = NOW()
              WHERE `user_id` = "
.$_SESSION['userid'];
  mysqli_query($link, $sql);
}

Die Abfragen


PHP Quellcode:
// liefert uns in $res die Anzahl der User,
// welche in den letzten 10 Minuten aktiv waren
$sql = "  SELECT count(*) AS `anzahl` FROM `users`
            WHERE `last_hit` > DATE_SUB(NOW(), INTERVAL 10 MINUTE)"
;
$res = mysqli_query($link, $sql); // $res in gewohnter Weise auswerten

PHP Quellcode:
// liefert uns in $res alle User,
// welche in den letzten 10 Minuten aktiv waren
$sql = "  SELECT `user_name` FROM `users`
            WHERE `last_hit` > DATE_SUB(NOW(), INTERVAL 10 MINUTE)"
;
$res = mysqli_query($link, $sql); // $res in gewohnter Weise auswerten








Irrwege


Bei einer naiven Herangehensweise könnte man auf einige falsche Ideen kommen.

online=1


Der Gedanke:
Bei dem Login des Users setze ich in der Usertabelle, bei dem User ein Flag "Online" auf 1 oder True. Und beim Logout auf 0 oder False.

Das klappt so nicht, weil:
Beim testen, scheint noch alles OK zu sein. Aber in der Praxis zeigt sich ganz schnell, dass ettliche User sich nicht ausloggen. Also einfach den Browser schließen. Auch Netzwerkabbrüche, Stromausfälle usw. bekommen wir damit nicht in den Griff. Auf Dauer werden sich so viele User ansammeln, welche unser Flag auf 1 stehen haben, aber schon seit Stunden weg sind.


Sessiondaten


Der Gedanke:
Ist doch ganz einfach, ich schaue in dem Ordner nach, wo die ganzen Sessiondateien liegen. Alle Dateien zählen, dann weiß ich die Anzahl der Besucher. Und mit unserialize, komme ich sogar an die Namen.

Das klappt so nicht, weil:
Nunja, evtl ist man nicht alleine auf dem Server! Schlimmsten falls muß man sich den Tempordner mit vielen anderen Domaininhabern teilen. Soll man deren Sessions auch mitzählen, lesen und untersuchen? Nein! Das verbietet sich.
Evtl ist das PHP auch durch den "Suhosin hardening patch" geschützt. Dann wirds schwer/unmöglich die Sessiondaten auszulesen, weil dieser die Daten verschlüsselt.
Zur guter Letzt:
Die Sessionverwaltung löscht abgelaufene Sessions nicht unbedingt sofort. Einstellbar in der php.ini. Auch ist das Auslesegedöns recht lahmarschig, also ein Klotz am Bein.

IP / SessionID merken


Der Gedanke:
Jagut, dann lege ich eben dafür eine extra Tabelle an! Dort merke ich mir die SessionID oder die IP Adresse und den Zeitpunkt des letzten Zugriffs.

Das klappt so nicht, weil:
Wie im Artikel Session Sicherheit beschrieben, ist es sinnvoll die SessionID häufiger mal zu wechseln. Selbst die IP ist nicht sonderlich zuverlässig. Auch sammeln sich in der Tabelle, im laufe der Jahre, viele Einträge an, die völlig sinnlos sind, weil abgelaufen.

Ausnahme:
Um Gäste zu zählen, also Besucher welche sich nicht eingelogt haben. In dem Fall dürfte das der einzig gangbare Weg sein. Dann aber bitte den Conjob nicht vergessen, welcher die Tabelle regelmäßig aufräumt.

« Vorheriges Kapitel   Tutorials
  Nächstes Kapitel »

Mitwirkende: hellbringer, combie
Erstellt von combie, 19.03.2008 am 11:32
Zuletzt bearbeitet von hellbringer, 25.10.2015 am 09:07
1 Kommentare , 22479 Betrachtungen

Dieser Text steht unter der GNU-Lizenz für freie Dokumentation


 

Lesezeichen

Stichworte
datetime, date_sub, login, mysql, online anzeige, tutorial

Artikel-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu
Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Anzeige der User die online sind anyone PHP 8 10.09.2007 10:15
User online Anzeige (IRC) protonlover PHP 5 11.02.2006 15:28
User-Online-Anzeige mit Sessions cryo PHP 2 23.11.2005 15:27
User-online Anzeige Bismarck1815 PHP 3 10.08.2005 15:17
welcher user ist online anzeige eric_draven_1984 PHP 2 04.07.2003 09:39


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:58 Uhr.


Powered by vBulletin® Version 3.8.8 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by NuWiki v1.3 RC1 Copyright ©2006-2007, NuHit, LLC