nach 15 min. soll sich eine session ja....

Vaio82

Erfahrenes Mitglied
... angeblich zerstören - wenn man nichts macht - (habe allerdings noch NIE etwas darüber im Netz finden können!) - hierzu nun meine frage...

ich möchte beim starten der session einen eintrag in eine db-tabelle machen, um anhand dieses eintrags eine "usernamen-online-übersicht" zu erstellen. nur wie bekomme ich den status aus der db raus, wenn sich die personen nicht ausloggen (session destroy()) ?

könntet ihr mir da bitte einen denkanstoß geben?

wäre ganz klasse von euch... :)
 
Erstmal ist der php.ini-Eintrag session.cache_expire dafür verantwortlich, wie
lange eine Session gültig ist.

Das Andere, mit der User-Online-Anzeige:
Du hast die Session-ID: session_id()
Diese nimmst du und packst sie in eine Datnebank die ungefär so aussieht:
Code:
sid (varchar 100)  |  lastactivity (int 12 )
Gleichzeitig speicherst du noch den aktuellen Timestamp in die Zeile.
Wenn der Besucher das Dokument nun neu läd, schaust du, ob schon eine Zeile
mit seiner SID vorhanden ist.
Wenn ja: lastactivity aus der Zeile updaten.
Wenn neine: Neue Zeile anlegen und logischerweise lastactivity gleich eintragen.

Gleichzeitig schaust du, welche lastactivity-Einträge älter als, sagen wir mal,
zehn Minuten sind.
Diese löschst du aus der Tabelle raus.

Anmerkung: der Tabellentyp kann, wenn du MySQL hast, ruhig Heap sein,
weil die Daten ja eh temporär sind und es ausserdem einen Vorteil in der
Geschwindigkeit bringt.
 
Gleichzeitig schaust du, welche lastactivity-Einträge älter als, sagen wir mal,
zehn Minuten sind.
Diese löschst du aus der Tabelle raus.

na ja, so habe ich es mir auch schon gedacht, aber ich dachte, dass das einfacher gehen würde, anstatt den timstamp auszuwerten und ggfs. per foreach() die vorhandenen einträge zu löschen... aber danke dir :)
 
Per foreach bruahcst du die Datensätze nicht löschen.
Es reicht, wenn du eine Variable mit dem Mindesttimestamp nimmst.
z.B. $mintime = time()-600;
(Wäre dann aktuelle Zeit - 10 Minuten (60*10))

Dann machst du einfach die SQL-Abfrage:
DELETE FROM tabelle WHERE TimestampSpalte < $mintime

Dann löscht MySQL alle Datensätze, die älter als 10 Minuten sind.

So wird das ganze in der Regel bei allen Boards gemacht.
Mir ist keine andere Lösung bekannt.
 
Hi Daxi! :o)

Danke für deine Antwort, habe das jedoch an dem Abend schon so realisiert:

PHP:
$result = mysql_query("select * from nmscc_mitarbeiter_online");
			while($zeile = mysql_fetch_object($result)){ 
				$id_user = $zeile->user;
				
				$login_time = $zeile->timestamp;
				$login_time = $login_time +900;
			
				$akt_zeit = time();
			
			 if($login_time < $akt_zeit){
						 	mysql_query("delete from nmscc_mitarbeiter_online where user = '$id_user'");
							}
			
			
			
			// Mitarbeitername
					$result1 = mysql_query("select id,name,email from nmscc_mitarbeiter where id = '$id_user'");
						while($zeile1 = mysql_fetch_object($result1)){ 
							echo(" <a href=\"mailto:$zeile1->email\" title=\"Letzte Aktion um: ");print date("H:i:s", $zeile->timestamp);  echo(" Uhr\">$zeile1->name</a><br>");
						}}

Frohe Weihnachten und schöne Geschenke... :-)
 
Hm, wieso nicht einfach so:
PHP:
if ( $bEintragVorhanden ) {
    mysql_query("UPDATE `online_members`
                 SET `lastactivity`='".time()."'
                 WHERE `sid`='".session_id()."';");
} else {
    mysql_query("INSERT INTO `online_members`
                 ( `sid`, `lastactivity` )
                 VALUES ( '".session_id()."', '".time()."' );");
}
[...]
mysql_query("DELETE FROM `online_members`
             WHERE `lastactivity`<".(date() - 600).";");
[...]
mysql_query("SELECT `sid` FROM `online_members`;");
//Ergebnis anzeigen
Kann natürlich noch erweitert werden, z.B. statt der SessionID eine Mitarbeiter-ID
nehmen, usw...
 
Zurück