[php] eingeloggte user anzeigen

wurzelsepp

Ensign
Registriert
Jan. 2005
Beiträge
217
hallo..!

wollt grad mal nachfragen, wie ich es denn am sinnvollsten anstelle, eingeloggte user anzuzeigen: das problem dabei ist, dass das ja irgendwo zentral gespeichert werden muss, da ja jeder sehen soll, wer und wer nicht eingeloggt ist...

es geht mir hier gar nicht so sehr um den code an sich, sondern um die klärung eines sinnvollen prinzips. lässt sich sowas über das autoglobale array $_SESSIONS realisieren? rein intuitiv scheint mir das eher ungeeignet... ich dachte eher gefühlsmäßig, in derjenigen datenbanktabelle, in der ich alle bisher registrierten user speichere, eine extra spalte "LOGGED_IN" oder sowas anzulegen, die ich bei jedem erfolgreichen login bzw logout mit nem UPDATE-befehl aktualisiere. so muss nur kurz in dieser datenbanktabelle nachgesehen werden und gut is. allerdings war das nur ne kleine überlegung - und da ich sowas auch noch nie gemacht hab, wollt ich an dieser stelle mal hier nachfragen. BEVOR ich was sinnloses zusammenfabriziere ;)

is diese idee sinnvoll, was meint ihr? wie würdet ihr bzw habt ihr so ein problem gelöst?
 
Würde ne Sessions tabelle machen mit Userkennung und Zeit der letzten Aktion. Und dann bei jedem Aufruf prüfen wenn jemand z.B. 5 minuten nicht mehr agiert hat, den Datensatz löschen.
 
sowas in dieser Richtung?


<?php
if ($config['user_ghost']==1) $sqlcommand.=' AND user_ghost<>1';
else $sqlcommand='';
$getuserinfo=$DB->query("SELECT user_nick, user_id FROM ".$db_tab['user']." WHERE user_activate=1 ".$sqlcommand." ORDER by logtime DESC LIMIT 8");
while ($userinfo=$DB->fetch_array($getuserinfo)) {
if (isonline($userinfo['user_id'])) $onlinestatus='online';
else $onlinestatus='offline';
$usernick=htmlentities($userinfo['user_nick']);
eval ("\$boxlinks[]= \"".getTemplate("navigation/lastuseronline")."\";");
}
?>
 
also ich stand vor der gleichen Frage, aber ich habe mich gegen die Variante mit dem db feld ONLINE und dann 1 oder 0 entschieden. Für mich ist die beste Lösung, einfach ein Feld mit last_activity und DATETIME, dort speichere ich auf jeder seite die letzten aktion. So kann man nach 5 min auch ein Timeout benutzen. Du lässt dir dann bei den Useronline einfach nur die anzeigen wo der letzte gespeicherte Zeitpunkt weniger als z.b 5 min zurückliegt.
Gleichzeitig könntest du den usern sogar noch sagen wann sie zuletzt eingeloggt waren.

Ich hoffe ich hab dir geholfen.

mfg

hemorieder
 
@hemorieder:

Die Lösung find ich schön! Aber ist es dann nicht so, dass man immer den kompletten Datensatz an Usern durchlaufen muss? Hat man 10000 User, so hat man dann 10000 if-Abfragen und das dann mehrmals pro Minute, oder seh ich das falsch? ;)

Lg,
Manuel
 
...

danke für alle antworten erstmal!

hmm. da für mich fragen nach den online-zeiten bzw. dem letzten login etc. nicht relevant sind (es geht in meinem fall wirklich nur darum, zu sehen, wer sonst noch alles online ist) scheint eine lösung über eine spalte in einer datenbanktabelle doch ganz sinnvoll..?!

bei erfolgreichem einloggen, wird dann der entsprechende eintrag bei diesem user geändert und zudem die gesamte benutzerliste durchgegangen, wer zu diesem zeitpunkt auch den status online hat(te). das is für meine erfordernisse vorerst mal ausreichend - denk ich ;)

bei meinen wenigen benutzern dürfte das kein stress sein; aber aus reinem interesse raus: wie is sowas denn zb in phpBB oder in anderen foren realisiert? auch über einen abgleich in einer datenbanktabelle?
 
Aw: ...

das wird so nicht funktionieren. http ist ein verbindungsloses protokoll - wenn sich also jemand nicht expliziet ausloggt wird er für immer als eingeloggt in der datenbank stehen.
 
...

hmm ja das stimmt!!

aber wie kann ich dieses problem umgehen?

bei den sessions in php ist es ja so, dass sie je nach einstellungen des php-interpreters, der auf dem betreffenden server läuft (bzw je nach genauer angabe im code) nach einer bestimmten zeit beendet werden (1440 sec nach default-einstellung, wenn ich nicht irre)...

die frage ist: wie kann man das entsprechend auch in diese idee mit der datenbank umsetzen? oder wie kann man das ganze sinnvoller bzw einfacher lösen?
 
Hallo,

in meinem Chat-System habe ich dies folgendermaßen gelöst:
In einer Tabelle wird die ID des Benzutzers/Gasts und ein Timestamp gespiechert.
Dieser Timestamp wird bei jeder Aktion des Benutzer erneuert.
Bei jedem Aufruf der Seite werden alle Datensätze gelöscht, in denen der Timestamp älter als 5 Minuten ist.
Die aktiven Besucher können dann einfach über die bestehenden Datensätze ermittelt werden.
Diese Variante hat sich bisher als sehr ressourcenschonend erwiesen.
Alternativ könnte man die Datenbank-Tabelle auch regelmäßig mit Cronjobs "aufräumen". ;)

MfG mh1001
 
Zuletzt bearbeitet:
Ich bastel grad selber an einem ähnlichen Problem, und habe tatsächlich einen Cronjob eingerichtet, der per w3m eine clean.php aufruft... ein wenig wirsch, das gebe ich zu, aber es funktioniert wunderbar...

mfg
 
um nen cronjob auszuführen brauch aber wohl die entsprechenden rechte bzw zugriffsmöglichkeiten auf dem server, oder? auf nem "normalen" webspace bei irgendnem anbieter wird das ohne weiteres nicht gehen, richtig?

@edit: hier hab ich was interessantes gefunden:
Nachdem wir jetzt alle Felder haben, die wir unbedingt brauchen, kommen jetzt die Spalten, die empfehlenswert, weil komfortabel sind.

Wie oben bereits geschrieben, wollen wir Sessions verwenden.
Da wir die Session immer starten müssen, können wir nicht davon ausgehen, dass sich hinter jeder Session ein eingeloggter Benutzer verbirgt.
Was spricht also dagegen, die Tabelle um eine Spalte für die ID der Session des Benutzers zu erweitern?
Bei nicht eingeloggten Benutzern steht in der entsprechenden Spalte natürlich nichts.

Natürlich könnte nach erfolgreichem Anmelden eine Variable in der Session registriert werden und dann nur diese abgefragt werden, aber die Variante wie wir sie hier machen, ist meiner Meinung nach besser, weil sie flexibler im Hinblick auf Erweiterungen wie z. B. Rechtevergabe und -entzug ist.
Mit Hilfe dieser Spalte kann natürlich auch festgestellt werden, welche Benutzer momentan eingeloggt sind und welche nicht.
daraus lässt sich vielleicht was machen... aber die frage ist doch wieder: wenn man beim einloggen einen wert in ein tabellenfeld schreibt, der user sich aber nicht ausloggt - wie kriegt man ihn denn dann dort wieder raus?
 
Zuletzt bearbeitet:
doch cronjobs kannst du auch auf normalen webservern benutzen. Jedoch würde ich den Cronjob nur ab und zu benutzen (2-3 mal am tag) und den rest bei einem benutzer im hintergrund machen. Du wirst aber nicht darum kommen, den timestramp der letzten Aktion zu speichern.
Und wegen der großen Tabelle und mehr als 1000 ifs, das ist natürlich eigentlich quatsch, da du natürlich gleich im query die abfrage mit reinbringst und nur das felt online abfragst.

Aber natürlich muss ich dir trotzdem recht geben, theoretisch weren dann so viele abfragen aufgeführt, aber von mysql und nicht vom php script aus, und somit kaum ressourcenlastig
 

Ähnliche Themen

Zurück
Oben