Who is online- Auf alle Sessions zugreifen

Carrear

Erfahrenes Mitglied
Kann man mittels PHP irgendwie auf alle Sessions (sämtlicher eingeloggten User) zugreifen? Ich möchte ein Who is Online Script schrieben und kann mir nicht vorstellen wie man das sonst machen sollte. Ich könnte ja sonst z.B. Beim einloggen in einer DB eine wert "online" auf 1 setzen und beim logout auf 0. Wenn man sich nicht ausloggt könnte ich per Cronjob alle 5 Minuten auf 0 setzen lassen, aber woher soll der Cronjob wissen wer momentan online ist, denn "online" würde ja dan nur beim Login auf 1 gesetzt?Man könnte es auch beim klicken jedes Links auf 1 setzen lassen aber das find ich ehrlich gesagt zu umständlich. Also geht das mit den Sessions?
 
Die Standardsicherungsmethode der Sitzungsvariablen ist dateibasiert, wobei die Sitzungsdateien im bestimmten Verzeichnis (siehe session.save_path-Konfigurationsoption) gespeichert werden. Wenn du auf dieses Verzeichnis Zugriff hast, könntest du die enthaltenen Dateien einfach auslesen und so die Benutzer ermitteln.
Alternativ könntest du auch eine eigene, vielleicht datenbankgestützte Sitzungsverwaltung nehmen. Damit wäre eine Abfrage noch einfacher.
 
Online-Anzeigen sind, da es sich bei HTTP um ein verbindungsloses Protokoll handelt, ohnehin nicht so recht genau, aber das ist dir wahrscheinlich bewußt :) .

Du erzeugst doch sicher für jeden Benutzer, der auf deine Seiten kommt eine Session. Also sicherst du bei jeder neuen Session entsprechende SID + Timestamp in einer Tabelle.
Wenn also jemand ne Seite anforderst, checkst du zuerst, ob es einen Eintrag mit der aktuellen Session id in deiner Tabelle gibt. Wenn ja, updatest du den Timestamp des Eintrages auf die aktuelle Zeit - wenn nicht legst du nen neuen Eintrag mit SID und Timestamp an. Loggt sich ein User ein, kannst du entsprechenden Eintrag sofort entfernen. Ansonsten mit nem Cronjob regelmäßig Einträge kicken bzw. bei jedem Aufruf einer beliebigen Seite.
 
Diese Funktion ist ja sehr kompliziert. Gibt es vielleicht ein Tutorial, welches sich mit diesem Thema in einem anderen Zusammenhang oder gegebenenfalls sogar im gleichen Zusammenhang beschäftigt? Habe eben ne kleine Runde damit gegoogelt, aber es kommen nur Standart Tuts, in denen der Befehl "zufällig" erwähnt wird.
 
Naja...bei jeder Aktion(jedem Aufruf einer Seite) wird ein aktueller Timestamp in die DB geschrieben.

Diese 300 Sekunden bedeuten nicht, dass derjenige 300 Sekunden online ist, sondern dass er vom Skript als Offlline angesehen wird, wenn er in den letzen 300Sekunden keine Seite aufgerufen hat.
Den Wert kannst du ja nach Gusto ändern.
 
Achso hab jetzt gar nicht gesehen, dass man da auch mit jedem Link den timestamp aktualisieren muss, dann hat sich es ja schon wieder gegessen und meine frage davor ist wieder aktuell.
 
Wenn Du die UserID in der Session speicherst kannst Du das Verzeichnis mit den Session-Files durchgehen und aus allen Session-Files die UserID auslesen. Diese kannst Du dann durch eine DB-Abfrage einem Usernamen zuordnen.
Uebrigens, ich wuerde empfehlen bei dieser Aktion gleich selbst zu ueberpruefen ob die Zeit von 5 oder 10 Minuten bereits verstrichen ist und die Datei gegebenenfalls loeschen. Der Garbage Collector von PHP loescht die Datei naemlich nicht gleich sobald sie abgelaufen ist sondern kann auch schonmal eine Weile warten bevor er dann wieder zuschlaegt.
 
Joa, aber wie derser Zugriff auf die Session files funktioniert habe ich nicht verstanden. Generell habe ich zugriff auf alles aufm Server.
 
Mittels session_save_path() kannst Du den Pfad aendern wo die Sessions gespeichert sind.
Das kann z.B. auf Systemen wichtig sein die Du Dir mit anderen teilst, im Grunde halt bei jedem Hoster. Weiterhin baeugt dies Zugriffs-Problemen vor, denn es koennte sein, dass der SafeMode verhindert, dass Du auf /tmp (wo normalerweise die Session-Files liegen) nicht zugreifen kannst.
Anschliessend durchsuchst Du das Verzeichnis nach Dateien, ueberpruefst den Zeitpunkt der letzten Aenderung. Falls zu alt -> loeschen, ansonsten -> UserID auslesen.

Hier mal der Code von meinem Garbage-Collector:
PHP:
<?php
$session_prefix="sess_";
$sessions=mysql_query("select * from sessions",$mydb);
while ($session=mysql_fetch_assoc($sessions))
	{
		if (file_exists($session_path."/".$session_prefix.$session['sessionid']))
			{
				if (filectime($session_path."/".$session_prefix.$session['sessionid'])+600<time())
					{
						unlink($session_path."/".$session_prefix.$session['sessionid']);
					}
			}
		if (!file_exists($session_path."/".$session_prefix.$session['sessionid']))
			{
				if ($session['userid']!="0")
					{
						$logouttime=time();
						mysql_query("update users set lastseen='".$logouttime."',logintime='' where id='".$session['userid']."'",$mydb);
					}
				mysql_query("delete from sessions where sessionid='".$session['sessionid']."'",$mydb);
			}
	}
?>
Hier werden die Sessions auch in der DB festgehalten, das hat den Vorteil, dass Du den Zeitpunkt des letzten Logins und des letzten Logouts (ob nun manuell oder automatisch nach Ablauf der Session) festhalten kannst.
 
Zurück