Sessions zeitabhänig destroyen?

So hab mal was gegoolt aber nix gefunden. Komisch eig.
Nun aber zu meiner Frage, kann man session die mit session_start() angelegt wurden nach einer bestimmten Zeit zerstören lassen? von mir aus ein tag oder so oder 3 std....

Als ich will die sessions benutzen um einen user einzuloggen. Jedoch verlässt er die Seite soll er ausgeloggt werden und nicht mehr inner Online Spalte angezeigt werden...

wäre cool wenn mir da jmd. mal helfen könnte.
 
mmh du könntest die letzte aktivität des counters mit schreiben

also wenn der user eine seite aufruft setzt du einen timestamp und bei der ausgabe überprüfst wie alt der timestamp ist ->älter als 10min ->user wahrscheinlich nicht online auf seite ->wird nicht mehr als online gelistet

kannst dafür einen extra cookie nutzn oder einfacher schreibst es mit in die session rein
 
Die Sessions werden nach einer bestimmten Zeit automatisch gelöscht. Nach wie vielen Sekunden der Inaktivität der Server aufräumen soll, ist in der php.ini festgelegt (session.gc_maxlifetime).

Wenn du eine Session manuell beenden willst (z.B. Abmeldung) kannst du session_destroy() benutzen.
 
Joar ich hab das mal so ausprobiert, wie folgt (nur wichtige programmzeilen):

index.php:
PHP:
if(isset($_GET['action'])=="Login"){
	setcookie("login", "eingeloggt", time() + (60*60));} 

	session_start();

login.php:
PHP:
if($_REQUEST['action']=="logout"){
	$sql = "UPDATE user SET eingeloggt=0 WHERE ID='".$_SESSION['user_id']."'";
	$result = mysql_query($sql) OR die(mysql_error());
        unset($_SESSION['user_id']);
        session_destroy();}
        
elseif(!isset($_COOKIE['login'])) {
 	$sql = "UPDATE user SET eingeloggt=0 WHERE ID='".$_SESSION['user_id']."'";
 	unset($_SESSION['user_id']);
 	session_destroy();
	$result = mysql_query($sql) OR die(mysql_error());}

Klappt auch alles soweit, sprich der suer wird ausgeloggt nach einer bestimmten Zeit. jedoch verlässt er die Seite (Browser zugemacht, PC runter gefahren etc.) ist der User nach wie vor als Online gekennzeichnet, sprich in der DB steht bei eingeloggt noch die 1.

Wie kann ich das so machen, bzw. überprüfen, und dann den User austragen aus der Onlinestatistik?
 
da der server genau dieses nicht mitbekommt geht das nur über eine zeitabfrage wie weiter oben erwähnt. bei mir mache ich das immer so, die index.php immer in der db nach dem timestamp der letzten aktivität guckt und sollte die bei jemandem einen bestimmten wert überschreiten, dann wird der aus der db entfernt und somit auch nicht mehr angezeigt. du könntest vielleicht auch regelmäßig die seite automatisch neu laden lassen. wenn der browser geschlossen wurde funktioniert der reload nicht mehr und du bekommst das indirekt mit.
 
Also zum verständnis
in der DB nen timestamp einfügen.. diesen dann übrprüfen, ob der timestamp größer ist als beisspielswiese ne std. Dann soller den User aus der DB schmeißen?

Aber das geht ja eig. auch nur wenn der User den Reload betätigt oder?!
Weil ich das ja abhängig von der Userid mach die in die Session eingetragen wurde.

Wie könnte ich denn den autom. Reload hervorrufen, und dann überprüfen, was du bereits sagtest lightsaver?
 
warum automatischer reload?

sobald IRGENDJEMAND auf deine seite geht wird das php scrip eh mit geladen und das prüft dann ob der timestamp grö0er als ne stunde is schmeist das raus und weite runten im script ->wird dann die noch vorhanden user ausgegeben
 
naja, die überprüfung wegen den timestamps kann ja jeder machen. beim aufruf der index.php guckt diese einfach in der db nach allen einträgen mit timestamp > 60 min (zum beispiel) da brauchst du die id ja nicht.
ansonsten hast du ja für jeden benutzer eine session. damit ja die id. wenn der jenige ne neue seite aufruft (falls du mehr als nur die index.php hast) oder halt die index.php nochmal aufruft, reloaded, dann ist das ja eine tätigkeit. und auf jeder dieser seiten brauchst du einfach eine funktion, die den timestamp in der db aktuallisiert. so wie du den mal eingetragen hast geht das auch hier.
den reload könntest du z.b. über ein meta refresh (content dann einfach weglassen) realisieren. dabei wird die index.php neu geladen und somit auch alle funktionen also auch das update des timestamp durchgeführt.

@chakky:

der reload war nur eine idee, um user noch als online zu erkennen, auch wenn die nichts tun. je nachdem, wie man die zeitspanne für den reload wählt (z.b. 1 min oder so) kann man die online-anzeige recht aktuell halten. wer aktiv ist wird wohl unter diesem wert bleiben und damit wird die seite nicht neu geladen (wert muss natürlich angepasst werden zum inhalt der seite und zur erwarteten aktivität), aber man erkennt, ob der browser noch offen ist. genau das ist nämlich das problem. wenn er eine aktivität macht und dann direkt den browser schließt wird er noch die ganze zeit als online geführt bis der timestamp abgelaufen ist. und genau in diese richtung ging ja auch die frage ;) ansonsten ist der reload natürlich nichts notwendiges
 
mmh da sehe ich das problem beim reload zum bsp einer eingabe per formular und abschicken per post

wenn da ein reload gemacht wird kommt ja die nette meldung ob du die post sachen nochmal senden willst oder nicht

man könnte dann maximal mit einen iframe machen das die anzeige nur neu geladen wird
 
ich glaub ich habe es ^^
Also über meine index.php wird alles eingebunden, sprich sie wird immer auch bei Seitenwechsel aufgerufen.

index.php (Waren noch kleine Fehler drinne)
PHP:
if($_SESSION['user_id']){
$sql = "UPDATE user SET lastlogin='".time()."' WHERE ID='".$_SESSION['user_id']."'";
$result = mysql_query($sql) OR die(mysql_error());}

$sql1 = "SELECT ID,Name,lastlogin FROM user WHERE (lastlogin+60)<'".time()."'"; 
$result1 = mysql_query($sql1) OR die("Datenbankfehler!");
if(mysql_num_rows($result1)) {

          while($row = mysql_fetch_assoc($result1)) {
          	$sql = "UPDATE user SET eingeloggt=0 WHERE ID='".$row['ID']."'";
			$result = mysql_query($sql) OR die(mysql_error());}}

wäre jezz nur für eine Minute zum testen, biher klappt das eig. auch gut ^^so wie ich es getestet habe.
 
Zurück
Oben