kostenloser Webspace werbefrei: lima-city


Rest-Zeit bis Session abgelaufen ist ?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    spiele2u

    spiele2u hat kostenlosen Webspace.

    Hallo

    Wie kannich ermitteln, wann eine Session abgelaufen sein wird ?

    was ist der Unterschied von session.cache_expire und session.cookie_lifetime

    ich habe als Test eine SESSION gestartet und versuche an Zeit-Werte zu kommen:

    session_start(); 
    
    $expires = session_cache_expire(); 
    
    $params = session_get_cookie_params(); 
    $lifetime = $params['lifetime']; 
    
    print "<br /> Expires: ".$expires."\n";    // --- in Minuten 
    print "<br /> Lifetime: ".$lifetime."\n";  // --- in Sekunden


    Als Ergebnis bekomme ich:

    Expires: 60 
    Lifetime: 86400


    Welcher Wert sagt jetzt was aus? .... wie lange existiert jetzt die Session?

    86400 Sekunden = 1440 Minuten .... oder. ... 60 Minuten = 3600 Sekunden

    Macht es überhaupt Sinn,
    dass session.cache_expire und session.cookie_lifetime unterschiedliche Zeiten sind?
    ... wenn die Session "abgelaufen" ist, braucht man doch auch das Cookie nicht mehr ?

    PS: das Beispiel / derTest läuft nicht auf Lima-City-Webspace
    hier auf Lima bekomme ich Expires: 180 und als Lifetime den Wert: 0 (Null)
    .... wird hier garkein Session-Cookie angelegt ?

    in beiden Fällen ist session.cache_limiter = nocache

    Der Sinn des ganzen ist es, dem User zu sagen:
    Deine Session (Dein Login) ist noch xx Minuten und yy Sekunden aktiv.
    ... wie kann ich das machen ? ... Rest-Laufzeit bis Session inaktiv wird ermitteln / ausgeben ?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. g****e

    Kurze Erklärung:
    Der Cookie bleibt standardmäßig 1Tag bestehen, der Sessioncache jedoch nur 60min. Eigentlich komisch, doch bei jedem Aufruf wird die Sessioncachetime wieder resettet. Es ist also eigentlich ein Count Down welcher resettet wird. Dadurch kann die CacheExpireTime quasi endlos werden.
    Also sind die Zeiten relativ zu sehen ;-)

    Liebe Grüße
  4. Hallo,
    für deine eigentlich Frage habe ich keine Antwort, aber ich hätte eine Alternative. Wenn ich dich richtig verstanden habe willst du dass ein Cookie für X Minuten bestehen bleibt und dann ungültig wird. Ich würde das so machen, dass ich der Session einen ID gebe, diese mit dem Ablaufdatum in eine DB schreibe und bei bedarf dann wieder ausles. Also in etwa so:
    Tabelle mit den Session ID´s (Name: session):
    -ID-|--gueltig_bis--
    --1-|-2012-11-17 05:23:05
    --2-|-2012-11-18 17:11:06
    --3-|-2012-11-20 53:45:18
    --4-|-2012-11-21 00:35:19

    PHP Code:
    session_start();
    $Datum = "2012-11-55 56:42:26"; //Beispielhaftes Datum
    $Verbindung = mysql_select_db("XYZ")
    or die ("Verbindung zur Datenbank fehlgeschlagen, bitte versuche es in ein paar Minuten  erneut!");
    $Eintrag = "INSERT INTO session
    (gueltig_bis)
    VALUES
    ('$Datum')";
    $Eintragen = mysql_query($Eintrag);
    mysql_close($Verbindung);

    Ich habe das jetzt nicht getestet, sollte aber funktionieren.
    MFG THWBM
  5. Autor dieses Themas

    spiele2u

    spiele2u hat kostenlosen Webspace.

    Hallo

    habe jetzt die Start-Zeit der Session mit in die $_SESSION rein gespeichert
    damit ich die bisher abgelaufene Zeit (und somit Rest-Zeit) ermitteln kann

    mein PHP-Code sieht jetzt so aus:
    ... zum Testen habe ich die "Login Aktiv Zeit" mal auf nur 30 Sekunden gesetzt ...

    <?php 
    // ---------------------------------------------------
    
    $username = 'demo'; 	// ---- Username
    $password = 'test'; 	// ---- Passwort im Klartext
    
    $saltkey1 = 'x3TzgF4';  // ---- ein geheimer Salt-Key
    
    $pass_hash = md5($saltkey1.$password); 	// ---- md5 Hash aus Passwort und Salt-Key
    
    date_default_timezone_set('Europe/Berlin');
    
    $timestamp = time(); 	// ---- aktueller TimeStamp
    
    $lifetime = 30; 		// ---- Login Aktiv Zeit in Sekunden
    
    
    // ---------------------------------------------------
    
    session_start(); 	// ---- Session starten	
    
    // ---------------------------------------------------
    
    
    // --------- Eingabe ---- Username und Passwort ----
    if ( !empty($_REQUEST['pwd']) && !empty($_REQUEST['usr']) ) { 
    	
    	$login_user = trim(chop($_REQUEST['usr'])); 
    	
    	$login_pass = trim(chop($_REQUEST['pwd'])); 
    	$login_hash = md5($saltkey1.$login_pass); 
    	
    	// --------- Passwort Prüfung ----
    	if ($username == $login_user && $login_hash == $pass_hash) { 
    		
    		$_SESSION['user'] = $login_user; 
    		$_SESSION['xpwd'] = $login_hash; 
    		$_SESSION['tmsp'] = $timestamp; 
    		
    		$msg = 'OK ... der Login als User: ".$login_user." war erfolgreich.'; 
    		
    	}
    	else { 
    		session_unset(); 
    		session_destroy(); 
    		
    		$msg = 'Fehler ... die Zugangsdaten sind nicht richtig.'; 
    	}
    
    }
    else { 
    	$msg = 'Zum Login bitte den Username und das Passwort eingeben.'; 
    }
    
    
    // ---------------------------------------------------
    
    
    // --------- Seiten Auswahl ----
    if ( !empty($_REQUEST['a']) ) { 
    $run_a = trim(chop($_REQUEST['a'])); 
    }
    else { 
    $run_a = 'start'; 
    }
    
    // --------- Seite: logout ----
    if ($run_a == 'logout') { 
    $msg = 'Logout erfolgreich ... die Sitzung wurde beendet.'; 
    session_unset(); 
    session_destroy(); 
    }
    
    
    // ---------------------------------------------------
    
    if ( isset($_SESSION['xpwd']) && $_SESSION['xpwd'] == $pass_hash) { 
    
    $logstart = $_SESSION['tmsp']; 
    $logdauer = ( $timestamp - $logstart ); 
    
    $rest_sec = ( $lifetime - $logdauer ); 
    
    if ($rest_sec < 1) { 
    $msg = 'Der Login vom '. date('Y-m-d (H:i:s)', $logstart) .' ist nicht mehr aktiv. Bitte neu einloggen.'; 
    session_unset(); 
    session_destroy(); 
    }
    else { 
    $msg = 'Der Login vom '. date('Y-m-d (H:i:s)', $logstart) .' ist noch '.$rest_sec.' Sekunden aktiv.'; 
    }
    
    }
    
    print "<br />\n"; 
    print "<span style=\"color:blue;\">".$msg."</span>\n"; 
    print "<br />\n"; 
    
    // ---------------------------------------------------
    
    if ( isset($_SESSION['xpwd']) && $_SESSION['xpwd'] == $pass_hash) { 
    
    print "<br />\n"; 
    print "<br />\n"; 
    
    print " --- <a href=\"?a=start\">HOME</a> "; 
    print " --- <a href=\"?a=edit\">EDIT</a> "; 
    print " --- <a href=\"?a=logout\">LOGOUT</a> "; 
    
    print "<br />\n"; 
    print "<br />\n"; 
    
    print "<br />Seite: ".$run_a."\n"; 
    
    print "<br />\n"; 
    print "<br />\n"; 
    
    print "<pre style=\"background:#DEDEDE;\">\n"; 
    print_r($_SESSION); 
    print "</pre>\n"; 
    
    print "<br />\n"; 
    print "<br />\n"; 
    
    }
    else { 
    
    // ---------------------------------------------------
    
    $login_form = '
    <form name="form1" method="post" action="">
      Username: <input type="text" name="usr" size="24" maxlength="36" /> 
      <br /> Passwort: <input type="text" name="pwd" size="24" maxlength="36" /> 
      <input type="hidden" name="a" value="start" /> 
      <br /> OK: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input type="submit" name="go" value="Login" /> 
    </form>
    '; 
    
    print "<br />\n"; 
    print "<br />\n"; 
    
    print $login_form; 
    
    print "<br />\n"; 
    print "<br />\n"; 
    print "<br /><u>Demo/Test Zugangsdaten:</u>\n"; 
    print "<br />&nbsp;&nbsp; Username: <strong>".$username."</strong>\n"; 
    print "<br />&nbsp;&nbsp; Passwort: <strong>".$password."</strong>\n"; 
    print "<br />\n"; 
    
    
    }
    
    // ---------------------------------------------------
    ?>


    es scheint so ja zu funktionieren, Logout per Link-Klick bzw. nach xx Sekunden
    ... oder sieht jemand noch einen Fehler ?
  6. spiele2u schrieb:
    ... oder sieht jemand noch einen Fehler ?

    Soweit ich weiß gehört das
    session_start();
    als allererstes, also ohne irgendetwas außer dem öffnendem
    <?php
    davor.
    MFG THWBM
  7. thwbm schrieb:
    Soweit ich weiß gehört das
    session_start();
    als allererstes, also ohne irgendetwas außer dem öffnendem
    <?php
    davor.
    MFG THWBM

    Nein das muss nicht sein. Das sagt man nur allgemein Anfängern, damit sie nicht überfordert werden. Du kannst es auch ganz unten schreiben, es darf vorher nur keine Ausgabe erfolgen.
    <?php
    $text = 'Ich bin ein kurzer Text. Meine Session-ID ist: ';
    session_start ();
    echo $text.session_id ();
    ?>


    Beitrag zuletzt geändert: 17.11.2012 17:12:41 von chatter
  8. Vielleicht ist es sinnvoll, wenn du weißt das du keine Ausgabe hast die Session in eine Art "Loader" zu starten. Ich hab beispielsweise eine Datei "init.php", dessen Inhalt wie folgt aussieht:

    <?php
    Database::connect('host', 'user', 'password', 'database');
    
    function __autoload($class){
    	$file = 'class' . DIRECTORY_SEPARATOR . $class .'.php';
    	
    	if(file_exists($file))
    	{
    		require_once($file);
    	}
    }


    Damit werden alle Dateien in dem Ordner "class" geladen und per require_once geholt. Da würde ich meine Session starten ^^
  9. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    kill-a-teddy schrieb:

    Damit werden alle Dateien in dem Ordner "class" geladen und per require_once geholt. Da würde ich meine Session starten ^^
    Wohl kaum.

    Das wird nur Klassen laden, die du verwendest… wenn du also
    Database
    benutzt wird die Datei
    class/Database.php
    geladen, aber nur wenn du sie benutzt!

    Für das Starten deiner Session ist das also eher unpraktisch. Mit dem Thema dieses Threads hat das auch relativ wenig zu tun ;-)

    Was hier allerdings eine wichtigere Frage ist: will der TE nur ermitteln wie lange seine Session noch läuft oder will er sie selbst auf eine gewisse Laufzeit begrenzen?
    Wenn nur ermittelt werden soll wie lange sie läuft hilft es eventuell zu wissen, dass die Laufzeit bei jedem Aufruf von
    session_start()
    wieder verlängert wird.
  10. hackyourlife schrieb:
    Wohl kaum.

    Das wird nur Klassen laden, die du verwendest… wenn du also
    Database
    benutzt wird die Datei
    class/Database.php
    geladen, aber nur wenn du sie benutzt!

    Für das Starten deiner Session ist das also eher unpraktisch. Mit dem Thema dieses Threads hat das auch relativ wenig zu tun ;-)

    Was hier allerdings eine wichtigere Frage ist: will der TE nur ermitteln wie lange seine Session noch läuft oder will er sie selbst auf eine gewisse Laufzeit begrenzen?
    Wenn nur ermittelt werden soll wie lange sie läuft hilft es eventuell zu wissen, dass die Laufzeit bei jedem Aufruf von
    session_start()
    wieder verlängert wird.


    Naja warum eine Datei laden, die man nicht benutzt? :D Würde die Session dort drin stehe, dann würde sie nur dann aufgerufen werden, wenn man "irgendeine" klasse verwendet und der autoloader zum Einsatz kommt. Wenn man also vorher die Klasse instanziert, dann würde der autoloader alle dateien, die verwendet werden aufrufen, die session startet dann direkt nach den aufrufen, lädt man die Seite neu, so wird auch die Session erneut gesetzt (kann man aber mit einer simplen IF-Abfrage abfangen, oder nicht? ) . Ich empfinde das als Komfortabel und Ressourcen Schonend, da nicht gebrauchte Dateien auch nicht aufgerufen werden. :)
  11. Autor dieses Themas

    spiele2u

    spiele2u hat kostenlosen Webspace.

    hackyourlife schrieb:
    Was hier allerdings eine wichtigere Frage ist: will der TE nur ermitteln wie lange seine Session noch läuft oder will er sie selbst auf eine gewisse Laufzeit begrenzen?


    eigentlich beides
    ... aber das "selbst auf eine gewisse Laufzeit begrenzen" habe ich ja hinbekommen,
    (siehe oben im Beispiel: ... "Login Aktiv Zeit" mal auf nur 30 Sekunden)

    offen ist noch die Frage, welche Zeit der User (ohne eigene Begrenzung) inaktiv bleiben kann, also wann die Session von selbst enden würde, wenn kein
    session_start()
    wieder ausgeführt wird
    ... ist das session.cache_expire oder session.cookie_lifetime ?


    hackyourlife schrieb:
    Wenn nur ermittelt werden soll wie lange sie läuft hilft es eventuell zu wissen, dass die Laufzeit bei jedem Aufruf von
    session_start()
    wieder verlängert wird.


    zum Logout nach selbst bestimmter Zeit
    habe ich die Login-Zeit in die Session gespeichert:
    $_SESSION['tmsp'] = $timestamp;

    und kann diese ja dann gegen $lifetime mit der Differenz des aktuellen $timestamp vergleichen (siehe oben)

    mal angenommen,
    ich setzte diese selbt bestimmte Zeit größer als die eigenliche (interne) Laufzeit der Session,
    dann kann bei längerer Inaktivität des User (also
    session_start()
    wird nicht wieder ausgeführt)
    die Session auch "vorher" beendet sein als von mir (in $lifetime) selbst festgelegt.

    schön wären 2 verschiedene Ausgaben (als CountDown mit JavaScript, zählt ohne Seiten-Reload))

    a) der eine sagt: Die Sitzung ist noch noch xx Minuten und yy Sekunden gültig (= eigene Laufzeit)
    b) der andere sagt: Die Sitzung endet nach xx Minuten und yy Sekunden Inaktivität (= Session Laufzeit)

    wobei nach jeder Aktivität der zweite Counter (b) wieder neu beginnt, der erste (a) aber weiter läuft
    evtl. sogar noch einen aus Script erzeugten reload zur LogOut-Seite, wenn a) oder b) abgelaufen


    ---> Info zur Erklärung / das Problem genauer erklärt:

    User kann im Login-Bereich Texte eingeben, und manche User brauchen dazu sehr lange,
    sie gehen zwischendurch mal ans Telefon, aufs Klo oder machen sontige Pausen,
    dann schreiben Sie weiter, wollen endlich "Speichern" und wenn Session beendet ist,
    dann sind alle Eingaben verloren, weil beim "Speichern" der Login nicht mehr aktiv war.

    Bisher ist für den User nicht erkennbar, wieviel (Rest-) Zeit er noch zur Eingabe hat ...

    ... also will ich zumindest einen Hinweis ausgeben, wie lange die Rest-Zeit noch ist,
    und ... wenn möglich ... bei Ablauf der Session (Login wird inaktiv) als Entwurf speichern
    damit die User-Eingaben nicht verloren gehen, sondern nach erneutem Login wieder aufrufbar sind

    Idee ... evtl kann ich an das Problem ja auch noch anders ran gehen?
    ... z.B. alle 2 Minuten als Entwurf zwischenspeichern (ohne Reload, mit Ajax im Hintergrund)
    aber eigentlich genügt es ja einmal, wenn Session / Login beendet wird ... oder? ... andere Ideen?


  12. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    spiele2u schrieb:
    Idee ... evtl kann ich an das Problem ja auch noch anders ran gehen?
    ... z.B. alle 2 Minuten als Entwurf zwischenspeichern (ohne Reload, mit Ajax im Hintergrund)
    aber eigentlich genügt es ja einmal, wenn Session / Login beendet wird ... oder? ... andere Ideen?
    Mach es doch so wie es auch hier auf lima-city funktioniert:

    In einem Intervall von z.B. 5 Minuten lädst du per AJAX eine PHP-Seite, die nur
    session_start()
    enthält. Dadurch wird jeweils das Cookie und die Sessionlaufzeit verlängert, ohne dass es vom User bemerkt wird. Wenn die Seite geschlossen wird, wird die Session nicht mehr verlängert und sie läuft irgendwann ab. Lässt der User die Seite offen kann die Session theoretisch beliebig lang aufrecht erhalten werden.
  13. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!