Wie lasse ich eine PHP-Sitzung nach 30 Minuten ablaufen?

Lesezeit: 11 Minuten

jQuery Kind des angeklickten Elements
Tom

Ich muss eine Sitzung 30 Minuten lang am Leben erhalten und sie dann zerstören.

  • Bitte beachten Sie, dass für die Einstellung der Sitzungszeit mindestens zwei Einstellungen entscheidend sind, möglicherweise drei. Die beiden sicherlich entscheidenden sind session.gc_maxlifetime und session.cookie_lifetime (wobei 0 nicht dasselbe ist wie eine lange Zahl). Für eine vollständige, 100-prozentige Sicherheit, lange Zeiten zuzulassen, kann es auch erforderlich sein, den session.save_path festzulegen, da die vom Betriebssystem gesteuerte Bereinigungszeit für das /tmp-Verzeichnis, in dem Sitzungsdateien standardmäßig gespeichert werden, unterschiedlich ist.

    – Kzqai

    7. April 2011 um 8:04 Uhr


  • Ich verstehe nicht, warum Sie die Sitzung ablaufen lassen möchten. Wenn Sie befürchten, dass der Benutzer seinen Computer verlässt, ohne sich abzumelden, und ein nicht autorisierter Benutzer seinen Computer übernimmt, wird der Sitzungsablauf auf Ihrer Website den Hijacker nicht daran hindern, auf die Dateien des Opfers auf der Festplatte zuzugreifen.

    – Gqqnbig

    10. Januar 2018 um 21:53 Uhr


  • @Gqqnbig: Nicht jede Sitzung ist aus den Gründen eingestellt, die Sie hier indirekt vorschlagen

    – Leben nach dem Gast

    15. November 2021 um 10:35 Uhr

Wie lasse ich eine PHP Sitzung nach 30 Minuten ablaufen
Gumbo

Sie sollten ein eigenes Sitzungs-Timeout implementieren. Beide von anderen erwähnten Optionen (session.gc_maxlifetime und session.cookie_lebensdauer) sind nicht zuverlässig. Ich werde die Gründe dafür erläutern.

Zuerst:

session.gc_maxlifetime
session.gc_maxlifetime gibt die Anzahl der Sekunden an, nach denen Daten als “Müll” angesehen und bereinigt werden. Die Garbage Collection findet während des Sitzungsstarts statt.

Aber der Garbage Collector wird nur mit einer Wahrscheinlichkeit von gestartet session.gc_probability geteilt durch session.gc_divisor. Und mit den Standardwerten für diese Optionen (1 bzw. 100) liegt die Chance nur bei 1 %.

Nun, man könnte diese Werte einfach so anpassen, dass der Garbage Collector öfter gestartet wird. Aber wenn der Garbage Collector gestartet wird, prüft er die Gültigkeit für jede registrierte Sitzung. Und das ist kostenintensiv.

Darüber hinaus bei Verwendung von PHPs default session.save_handler Dateien werden die Sitzungsdaten in Dateien in einem Pfad gespeichert, der in angegeben ist session.save_path. Bei diesem Session-Handler wird das Alter der Session-Daten auf das Datum der letzten Änderung der Datei und nicht auf das Datum des letzten Zugriffs berechnet:

Notiz: Wenn Sie den standardmäßigen dateibasierten Sitzungshandler verwenden, muss Ihr Dateisystem die Zugriffszeiten (atime) verfolgen. Windows FAT tut dies nicht, daher müssen Sie sich einen anderen Weg einfallen lassen, um die Garbage Collection Ihrer Sitzung zu handhaben, wenn Sie mit einem FAT-Dateisystem oder einem anderen Dateisystem festsitzen, in dem keine Zeitverfolgung verfügbar ist. Seit PHP 4.2.3 verwendet es mtime (modified date) statt atime. Sie werden also keine Probleme mit Dateisystemen haben, in denen keine Zeitverfolgung verfügbar ist.

Daher kann es zusätzlich vorkommen, dass eine Sitzungsdatendatei gelöscht wird, während die Sitzung selbst noch als gültig betrachtet wird, weil die Sitzungsdaten nicht kürzlich aktualisiert wurden.

Und zweitens:

session.cookie_lebensdauer
session.cookie_lebensdauer gibt die Lebensdauer des Cookies in Sekunden an, das an den Browser gesendet wird. […]

Ja, das ist richtig. Dies wirkt sich nur auf die Cookie-Lebensdauer aus und die Sitzung selbst kann möglicherweise noch gültig sein. Aber es ist die Aufgabe des Servers, eine Sitzung ungültig zu machen, nicht der Client. Das hilft also nichts. Tatsächlich haben session.cookie_lebensdauer einstellen 0 würde das Cookie der Sitzung zu einem echten machen Session-Cookie das gilt nur, bis der Browser geschlossen wird.

Fazit / beste Lösung:

Die beste Lösung besteht darin, ein eigenes Sitzungs-Timeout zu implementieren. Verwenden Sie einen einfachen Zeitstempel, der die Zeit der letzten Aktivität (dh Anfrage) angibt, und aktualisieren Sie ihn mit jeder Anfrage:

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // last request was more than 30 minutes ago
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

Das Aktualisieren der Sitzungsdaten bei jeder Anfrage ändert auch das Änderungsdatum der Sitzungsdatei, damit die Sitzung nicht vorzeitig vom Garbage Collector entfernt wird.

Sie können auch einen zusätzlichen Zeitstempel verwenden, um die Sitzungs-ID regelmäßig neu zu generieren, um Angriffe auf Sitzungen wie z Sitzungsfixierung:

if (!isset($_SESSION['CREATED'])) {
    $_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
    // session started more than 30 minutes ago
    session_regenerate_id(true);    // change session ID for the current session and invalidate old session ID
    $_SESSION['CREATED'] = time();  // update creation time
}

Anmerkungen:

  • session.gc_maxlifetime sollte mindestens gleich der Lebensdauer dieses benutzerdefinierten Ablaufhandlers sein (in diesem Beispiel 1800);
  • wenn Sie die Sitzung nach 30 Minuten ablaufen lassen möchten Aktivität statt nach 30 Minuten seit Anfangmüssen Sie auch verwenden setcookie mit Ablauf von time()+60*30 um das Session-Cookie aktiv zu halten.

  • Wie könnten Sie dies ändern, wenn Sie die “inaktive Zeit” überprüfen möchten? Mit anderen Worten, der Benutzer meldet sich an und solange er die Website weiterhin nutzt, wird er nicht abgemeldet. Wenn sie jedoch 30 Minuten lang inaktiv sind, werden sie abgemeldet?

    – Metropole

    9. August 2010 um 16:29 Uhr

  • @Metropolis: Verwenden Sie so etwas wie $_SESSION['LAST_ACTIVITY'] ähnlich zu $_SESSION['CREATED'] wo Sie die Zeit der letzten Aktivität des Benutzers speichern, aber diesen Wert bei jeder Anfrage aktualisieren. Wenn nun der Unterschied zwischen dieser Zeit und der aktuellen Zeit größer als 1800 Sekunden ist, wurde die Sitzung länger als 30 Minuten nicht verwendet.

    – Gumbo

    9. August 2010 um 16:37 Uhr

  • @Metropole: session_unset macht das gleiche wie $_SESSION = array().

    – Gumbo

    9. August 2010 um 19:06 Uhr

  • @Gumbo – Ich bin etwas verwirrt, solltest du deinen Code nicht in Kombination mit verwenden ini_set('session.gc-maxlifetime', 1800)? Andernfalls könnten Ihre Sitzungsinformationen zerstört werden, während Ihre Sitzung noch gültig sein sollte, zumindest wenn die ini-Einstellung die Standardeinstellung von 24 Minuten ist. Oder übersehe ich etwas?

    – jeroen

    27. Oktober 2010 um 21:05 Uhr

  • @jeron: Ja, das solltest du. Aber beachte das session.gc_maxlifetime hängt vom letzten Änderungsdatum der Datei ab, wenn der Session-Save-Handler files wird genutzt. Damit session.gc_maxlifetime sollte mindestens gleich der Lebensdauer dieses benutzerdefinierten Ablaufhandlers sein.

    – Gumbo

    27. Oktober 2010 um 21:13 Uhr

Wie lasse ich eine PHP Sitzung nach 30 Minuten ablaufen
Rafee

Einfache Art des PHP-Sitzungsablaufs in 30 Minuten.

Hinweis: Wenn Sie die Zeit ändern möchten, ändern Sie einfach die 30 mit Ihrer gewünschten Zeit und ändern Sie nicht * 60: Dies ergibt die Minuten.


In Minuten : (30 * 60)
In Tagen : (n * 24 * 60 * 60 ) n = Anzahl der Tage


Login.php

<?php
    session_start();
?>

<html>
    <form name="form1" method="post">
        <table>
            <tr>
                <td>Username</td>
                <td><input type="text" name="text"></td>
            </tr>
            <tr>
                <td>Password</td>
                <td><input type="password" name="pwd"></td>
            </tr>
            <tr>
                <td><input type="submit" value="SignIn" name="submit"></td>
            </tr>
        </table>
    </form>
</html>

<?php
    if (isset($_POST['submit'])) {
        $v1 = "FirstUser";
        $v2 = "MyPassword";
        $v3 = $_POST['text'];
        $v4 = $_POST['pwd'];
        if ($v1 == $v3 && $v2 == $v4) {
            $_SESSION['luser'] = $v1;
            $_SESSION['start'] = time(); // Taking now logged in time.
            // Ending a session in 30 minutes from the starting time.
            $_SESSION['expire'] = $_SESSION['start'] + (30 * 60);
            header('Location: http://localhost/somefolder/homepage.php');
        } else {
            echo "Please enter the username or password again!";
        }
    }
?>

Homepage.php

<?php
    session_start();

    if (!isset($_SESSION['luser'])) {
        echo "Please Login again";
        echo "<a href="http://localhost/somefolder/login.php">Click Here to Login</a>";
    }
    else {
        $now = time(); // Checking the time now when home page starts.

        if ($now > $_SESSION['expire']) {
            session_destroy();
            echo "Your session has expired! <a href="http://localhost/somefolder/login.php">Login here</a>";
        }
        else { //Starting this else one [else1]
?>
            <!-- From here all HTML coding can be done -->
            <html>
                Welcome
                <?php
                    echo $_SESSION['luser'];
                    echo "<a href="http://localhost/somefolder/logout.php">Log out</a>";
                ?>
            </html>
<?php
        }
    }
?>

LogOut.php

<?php
    session_start();
    session_destroy();
    header('Location: http://localhost/somefolder/login.php');
?>

  • Die Kombination von Logik und Präsentation ist in der heutigen Zeit, in der MVC die Norm ist, nicht ratsam.

    – bcosca

    9. Mai 2012 um 16:54 Uhr


  • @stillstanding Sprich für dich [smile] Ich sehe MVC als eine Abscheulichkeit an.

    Benutzer336063

    20. August 2014 um 22:39 Uhr

  • Ist MVC auch bei kleinen Projekten mit einem einzigen Programmierer eine gute Idee? Ich habe das Gefühl, ich sollte meine eigenen Projekte im MVC-Modell erstellen (oder das Problem lösen, DANN MVC machen), aber mit mangelnder Erfahrung mit MVC wird es nur zu einer mentalen Blockade “Wie mache ich dieses MVC?” und eine Ablenkung vom ursprünglichen Ziel/Problem, das eine Lösung erfordert.

    – MrVimes

    27. Juli 2018 um 9:36 Uhr

  • @bcosca Überhaupt nicht. Das Mischen von Logik mit Markup ist im Wesentlichen ein legitimes Muster in PHP. Darüber hinaus war das von Anfang an der Sinn von PHP. Und wenn Sie sich das heutzutage beliebteste Frontend-Framework ansehen: ReactJS, werden Sie sehen, dass es dasselbe tut.

    – CF

    22. Oktober 2019 um 7:59 Uhr

  • @bsosca wie viele hier sollten, sollten Sie mehr Zeit damit verbringen, sich über Lösungen für die Probleme Gedanken zu machen und dem OP zu erlauben, das herauszufinden, als eine Frage zu entführen, um einen Punkt zu machen, den Sie für gültig halten 😉

    – Matt

    23. Oktober 2019 um 19:27 Uhr

1647092050 48 Wie lasse ich eine PHP Sitzung nach 30 Minuten ablaufen
Roß

Soll der Benutzer nach einer festgelegten Zeit abgemeldet werden? Festlegen der Sitzungserstellungszeit (oder einer Ablaufzeit) bei der Registrierung und anschließendes Überprüfen, ob das Laden jeder Seite damit umgehen könnte.

Z.B:

$_SESSION['example'] = array('foo' => 'bar', 'registered' => time());

// later

if ((time() - $_SESSION['example']['registered']) > (60 * 30)) {
    unset($_SESSION['example']);
}

Bearbeiten: Ich habe aber das Gefühl, dass du etwas anderes meinst.

Sie können Sitzungen nach einer bestimmten Lebensdauer löschen, indem Sie die verwenden session.gc_maxlifetime ini-Einstellung:

Bearbeiten:
ini_set(‘session.gc_maxlifetime’, 60*30);

  • session.gc-maxlifetime ist wahrscheinlich der beste Weg.

    – Machtherr

    6. Februar 2009 um 13:45 Uhr

  • Es gibt einige Probleme mit der Lebensdauer von Sitzungscookies, vor allem hängt es davon ab, dass der Client sie erzwingt. Die Cookie-Lebensdauer soll es dem Client ermöglichen, nutzlose/abgelaufene Cookies zu bereinigen, sie ist nicht mit sicherheitsrelevanten Dingen zu verwechseln.

    – Jaco

    15. Mai 2012 um 12:32 Uhr

1647092050 514 Wie lasse ich eine PHP Sitzung nach 30 Minuten ablaufen
Pablo Pazos

Dieser Beitrag zeigt einige Möglichkeiten, das Sitzungs-Timeout zu steuern: http://bytes.com/topic/php/insights/889606-setting-timeout-php-sessions

IMHO ist die zweite Option eine nette Lösung:

<?php
/***
 * Starts a session with a specific timeout and a specific GC probability.
 * @param int $timeout The number of seconds until it should time out.
 * @param int $probability The probablity, in int percentage, that the garbage 
 *        collection routine will be triggered right now.
 * @param strint $cookie_domain The domain path for the cookie.
 */
function session_start_timeout($timeout=5, $probability=100, $cookie_domain="https://stackoverflow.com/") {
    // Set the max lifetime
    ini_set("session.gc_maxlifetime", $timeout);

    // Set the session cookie to timout
    ini_set("session.cookie_lifetime", $timeout);

    // Change the save path. Sessions stored in teh same path
    // all share the same lifetime; the lowest lifetime will be
    // used for all. Therefore, for this to work, the session
    // must be stored in a directory where only sessions sharing
    // it's lifetime are. Best to just dynamically create on.
    $seperator = strstr(strtoupper(substr(PHP_OS, 0, 3)), "WIN") ? "\\" : "https://stackoverflow.com/";
    $path = ini_get("session.save_path") . $seperator . "session_" . $timeout . "sec";
    if(!file_exists($path)) {
        if(!mkdir($path, 600)) {
            trigger_error("Failed to create session save path directory '$path'. Check permissions.", E_USER_ERROR);
        }
    }
    ini_set("session.save_path", $path);

    // Set the chance to trigger the garbage collection.
    ini_set("session.gc_probability", $probability);
    ini_set("session.gc_divisor", 100); // Should always be 100

    // Start the session!
    session_start();

    // Renew the time left until this session times out.
    // If you skip this, the session will time out based
    // on the time when it was created, rather than when
    // it was last used.
    if(isset($_COOKIE[session_name()])) {
        setcookie(session_name(), $_COOKIE[session_name()], time() + $timeout, $cookie_domain);
    }
}

Nun, ich verstehe, dass die obigen Antworten richtig sind, aber sie sind auf Anwendungsebene, warum verwenden wir sie nicht einfach .htaccess Datei zum Festlegen der Ablaufzeit ?

<IfModule mod_php5.c>
    #Session timeout
    php_value session.cookie_lifetime 1800
    php_value session.gc_maxlifetime 1800
</IfModule>

  • Diese Methode aktualisiert die Sitzung jedes Mal, wenn ich die Seite betrete?

    – Simone Rossaini

    14. Juli 2021 um 8:28 Uhr

1647092051 374 Wie lasse ich eine PHP Sitzung nach 30 Minuten ablaufen
Peter Mortensen

if (isSet($_SESSION['started'])){
    if((mktime() - $_SESSION['started'] - 60*30) > 0){
        //Logout, destroy session, etc.
    }
}
else {
    $_SESSION['started'] = mktime();
}

  • Diese Methode aktualisiert die Sitzung jedes Mal, wenn ich die Seite betrete?

    – Simone Rossaini

    14. Juli 2021 um 8:28 Uhr

1647092051 464 Wie lasse ich eine PHP Sitzung nach 30 Minuten ablaufen
AndyN

Verwenden Sie die session_set_cookie_params Funktion dazu.

Diese Funktion muss vor dem aufgerufen werden session_start() Anruf.

Versuche dies:

$lifetime = strtotime('+30 minutes', 0);

session_set_cookie_params($lifetime);

session_start();

Sehen Sie mehr in: http://php.net/manual/function.session-set-cookie-params.php

993740cookie-checkWie lasse ich eine PHP-Sitzung nach 30 Minuten ablaufen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy