Frage Wie veralte ich eine PHP-Sitzung nach 30 Minuten ab?


Ich muss eine Sitzung für 30 Minuten am Leben erhalten und dann zerstören.


935
2018-02-06 13:14


Ursprung


Antworten:


Sie sollten ein eigenes Sitzungszeitlimit implementieren. Beide Optionen werden von anderen erwähnt (session.gc_maxlifetime und session.cookie_lifetime) sind nicht zuverlässig. Ich werde die Gründe dafür erklären.

Zuerst:

session.gc_maxlifetime
session.gc_maxlifetime Gibt an, nach wie vielen Sekunden Daten als "Müll" betrachtet und bereinigt werden. Die Garbage Collection erfolgt während des Starts der Sitzung.

Aber der Garbage Collector wird nur mit einer Wahrscheinlichkeit von session.gc_probability geteilt durch session.gc_divisor. Bei Verwendung der Standardwerte für diese Optionen (1 bzw. 100) beträgt die Chance nur 1%.

Nun, Sie können diese Werte einfach so anpassen, dass der Garbage Collector häufiger gestartet wird. Wenn der Garbage Collector gestartet wird, überprüft er jedoch die Gültigkeit für jede registrierte Sitzung. Und das ist kostenintensiv.

Außerdem, wenn PHP Standard verwendet session.save_handler Dateien werden die Sitzungsdaten in Dateien in einem Pfad gespeichert, der in session.save_path. Bei diesem Sitzungshandler wird das Alter der Sitzungsdaten anhand des letzten Änderungsdatums der Datei und nicht anhand des letzten Zugriffsdatums berechnet:

Hinweis: Wenn Sie den standardmäßigen dateibasierten Session-Handler verwenden, muss Ihr Dateisystem die Zugriffszeiten (atime) verfolgen. Windows FAT ist nicht so, Sie müssen sich eine andere Methode ausdenken, um mit dem Sammeln Ihrer Sitzung umzugehen, wenn Sie mit einem FAT-Dateisystem oder einem anderen Dateisystem, in dem keine Zeitüberwachung verfügbar ist, stecken bleiben. Seit PHP 4.2.3 hat es mtime (Änderungsdatum) anstelle von atime verwendet. Sie werden also keine Probleme mit Dateisystemen haben, bei denen kein Tracking verfügbar ist.

Daher kann es auch vorkommen, dass eine Sitzungsdatendatei gelöscht wird, während die Sitzung selbst noch als gültig betrachtet wird, da die Sitzungsdaten in letzter Zeit nicht aktualisiert wurden.

Und zweitens:

session.cookie_lifetime
session.cookie_lifetime Gibt die Lebenszeit des Cookies in Sekunden an, die an den Browser gesendet wird. [...]

Ja, das ist richtig. Dies wirkt sich nur auf die Lebensdauer des Cookies aus und die Sitzung selbst kann weiterhin gültig sein. Aber es ist die Aufgabe des Servers, eine Sitzung ungültig zu machen, nicht den Client. Das hilft also nichts. In der Tat, haben session.cookie_lifetime einstellen 0 würde den Cookie der Sitzung zu einem echten machen Sitzungscookie Das ist nur gültig, bis der Browser geschlossen ist.

Fazit / beste Lösung:

Die beste Lösung besteht darin, ein eigenes Sitzungszeitlimit zu implementieren. Verwenden Sie einen einfachen Zeitstempel, der den Zeitpunkt der letzten Aktivität angibt (d. H. Anfrage) und aktualisieren Sie ihn bei 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

Durch das Aktualisieren der Sitzungsdaten bei jeder Anforderung wird auch das Änderungsdatum der Sitzungsdatei geändert, sodass 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 Sitzfixierung:

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 der Lebensdauer dieses benutzerdefinierten Ablaufbehandlungsroutinen entsprechen (1800 in diesem Beispiel);
  • Wenn Sie die Sitzung nach 30 Minuten ablaufen lassen möchten Aktivität statt nach 30 Minuten seit dem StartSie müssen auch verwenden setcookie mit einem Verfall von time()+60*30 um den Sitzungscookie aktiv zu halten.

1523
2017-08-13 09:24



Einfacher Ablauf der PHP Session in 30 Minuten.

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


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


Login.php

<?php
    session_start();
?>

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

<?php
    if ($_POST['submit1']) {
        $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!";
        }
    }
?>

Startseite.Page.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');
?>

113
2017-09-13 06:39



Soll der Benutzer nach einer bestimmten Zeit abgemeldet werden? Wenn Sie die Sitzungserstellungszeit (oder eine Ablaufzeit) bei der Registrierung festlegen und dann prüfen, ob bei jedem Laden der Seite dies möglich ist.

Z.B.:

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

// later

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

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

Sie können Sitzungen nach einer gewissen Lebensdauer mit der Funktion "Löschen" abbrechen session.gc_maxlifetime Ini-Einstellung:

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


33
2018-02-06 13:20



Dieser Beitrag zeigt ein paar Möglichkeiten, das Sitzungszeitlimit zu kontrollieren: http://bytes.com/topic/php/insights/889606-setting-timeout-php-sessions

IMHO die zweite Option ist 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='/') {
    // 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") ? "\\" : "/";
    $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);
    }
}

18
2017-10-07 02:31



Nun, ich verstehe die obigen Antworten sind richtig, aber sie sind auf Anwendungsebene, warum verwenden wir 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>

15
2017-07-15 06:16



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

11
2018-02-06 13:21



Benutze die session_set_cookie_paramsFunktion für das machen.

Diese Funktion muss vorher 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


11
2018-05-13 12:43