Jak wygasnąć sesję PHP po 30 minutach?

Muszę utrzymać sesję przy życiu przez 30 minut, a potem ją zniszczyć.

Author: Mob, 2009-02-06

11 answers

Powinieneś zaimplementować własny limit czasu sesji. Obie opcje wymienione przez innych (sesja.gc_maxlifetime oraz sesja.cookie_lifetime) nie są wiarygodne. Wyjaśnię powody.

Pierwszy:

Sesja.gc_maxlifetime
sesja.gc_maxlifetime określa liczbę sekund, po których dane będą postrzegane jako "śmieci" i czyszczone. Garbage collection występuje podczas sesji zaczynaj.

Ale garbage collector jest uruchamiany tylko z prawdopodobieństwem sesja.gc_probability podzielone przez sesja.gc_divisor. Przy użyciu domyślnych wartości dla tych opcji (odpowiednio 1 i 100) szansa wynosi tylko 1%.

Cóż, można po prostu dostosować te wartości tak, że garbage collector jest uruchamiany częściej. Ale po uruchomieniu garbage collector sprawdzi ważność każdej zarejestrowanej sesji. Oraz to jest kosztowne.

Ponadto, przy użyciu domyślnego PHPsesja.save_handler Plików, dane sesji są przechowywane w plikach w ścieżce określonej w sesja.save_path. W tej funkcji obsługi sesji wiek danych sesji jest obliczany na podstawie daty ostatniej modyfikacji pliku, a nie ostatniej daty dostępu:

Uwaga: Jeśli używasz domyślnej obsługi sesji opartej na plikach, Twój system plików musi śledzić dostęp razy (atime). Windows FAT nie, więc będziesz musiał wymyślić inny sposób radzenia sobie z zbieraniem śmieci sesji, jeśli utkniesz z systemem plików FAT lub innym systemem plików, w którym śledzenie czasu nie jest dostępne. Od wersji 4.2.3 PHP używa mtime (modified date) zamiast atime. Dzięki temu nie będziesz miał problemów z systemami plików, w których śledzenie czasu nie jest dostępne.

Więc dodatkowo może się zdarzyć, że plik danych sesji zostanie usunięty, gdy sama sesja jest nadal uznane za ważne, ponieważ dane sesji nie były ostatnio aktualizowane.

I drugi:

Sesja.cookie_lifetime
sesja.cookie_lifetime określa czas życia pliku cookie w sekundach, który jest wysyłany do przeglądarki. […]

Tak, zgadza się. Ma to wpływ tylko na żywotność plików cookie, a sama sesja może być nadal ważna. Ale zadaniem serwera jest unieważnienie sesji, a nie klienta. Więc to nie pomaga. cokolwiek. W rzeczywistości, mając sesji.cookie_lifetime ustawione na 0 sprawi, że plik cookie sesji stanie się prawdziwym plikiem cookie sesji, który jest ważny tylko do momentu zamknięcia przeglądarki.

Wniosek / najlepsze rozwiązanie:

Najlepszym rozwiązaniem jest zaimplementowanie własnego limitu czasu sesji. Użyj prostego znacznika czasu oznaczającego czas ostatniej aktywności (np. żądania) i aktualizuj go przy każdym żądaniu:

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

Aktualizowanie danych sesji przy każdym żądaniu zmienia również datę modyfikacji pliku sesji, aby sesja nie została usunięta przedwcześnie przez garbage collector.

Możesz również użyć dodatkowego znacznika czasu, aby okresowo regenerować identyfikator sesji, aby uniknąć ataków na sesje, takie jak utrwalenie sesji :

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
}

Uwagi:

  • session.gc_maxlifetime powinien być co najmniej równy żywotności tego niestandardowego programu obsługi wygaśnięcia (1800 W tym przykładzie);
  • jeśli chcesz zakończyć sesję po 30 minut aktywności zamiast po 30 minutach od rozpoczęcia, musisz również użyć setcookie z wygaśnięciem time()+60*30, aby utrzymać aktywny plik cookie sesji.
 1540
Author: Gumbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-25 07:58:39

Prosty sposób wygaśnięcia sesji PHP w 30 minut.

Uwaga: Jeśli chcesz zmienić czas, po prostu zmień 30 z żądanym czasem i nie zmieniaj * 60: to da minuty.


W minutach : (30 * 60)
W dniach: (n * 24 * 60 * 60 ) n = liczba dni


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!";
        }
    }
?>

Strona główna.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
        }
    }
?>

Wyloguj się.php

<?php
    session_start();
    session_destroy();
    header('Location: http://localhost/somefolder/login.php');
?>
 115
Author: Rafee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-24 12:44:52

Czy to ma na celu wylogowanie użytkownika po określonym czasie? Ustawianie czasu tworzenia sesji (lub czasu wygaśnięcia), gdy jest rejestrowany, a następnie sprawdzanie, czy na każdym załadowaniu strony może to obsłużyć.

Np.:

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

// later

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

Edit: mam wrażenie, że masz na myśli coś innego.

Możesz zrezygnować z sesji po pewnym okresie życia, używając session.gc_maxlifetime ustawienie ini:

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

 33
Author: Ross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-03 13:13:12

Ten post pokazuje kilka sposobów kontrolowania limitu czasu sesji: http://bytes.com/topic/php/insights/889606-setting-timeout-php-sessions

IMHO druga opcja to fajne rozwiązanie:

<?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
Author: Pablo Pazos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-07 03:52:04

Rozumiem, że odpowiedzi są poprawne, ale są na poziomie aplikacji, dlaczego po prostu nie użyjemy pliku .htaccess, aby ustawić czas wygaśnięcia ?

<IfModule mod_php5.c>
    #Session timeout
    php_value session.cookie_lifetime 1800
    php_value session.gc_maxlifetime 1800
</IfModule>
 15
Author: Touqeer Shafi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-15 06:16:41
if (isSet($_SESSION['started'])){
    if((mktime() - $_SESSION['started'] - 60*30) > 0){
        //Logout, destroy session, etc.
    }
}
else {
    $_SESSION['started'] = mktime();
}
 11
Author: middus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-10 19:39:06

Użyj session_set_cookie_paramsfunkcji make this.

Jest konieczne wywołanie tej funkcji przed wywołaniem session_start().

Spróbuj tego:

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

session_set_cookie_params($lifetime);

session_start();

Zobacz więcej w: http://php.net/manual/function.session-set-cookie-params.php

 11
Author: Wallace Maxters,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-01 13:30:48

W rzeczywistości jest to łatwe dzięki funkcji takiej jak poniżej. Używa nazwy tabeli bazy danych "sessions" z polami " id " i "time".

Za każdym razem, gdy użytkownik odwiedza Twoją witrynę lub usługę ponownie, powinieneś wywołać tę funkcję, aby sprawdzić, czy jej wartość zwracana jest prawdziwa. Jeśli jest to FALSE, użytkownik wygasł, a sesja zostanie zniszczona (Uwaga: Ta funkcja używa klasy bazy danych do łączenia i odpytywania bazy danych, oczywiście możesz to zrobić również wewnątrz funkcji lub czegoś takiego that):

function session_timeout_ok() {
    global $db;
    $timeout = SESSION_TIMEOUT; //const, e.g. 6 * 60 for 6 minutes
    $ok = false;
    $session_id = session_id();
    $sql = "SELECT time FROM sessions WHERE session_id = '".$session_id."'";
    $rows = $db->query($sql);
    if ($rows === false) {
        //Timestamp could not be read
        $ok = FALSE;
    }
    else {
        //Timestamp was read succesfully
        if (count($rows) > 0) {
            $zeile = $rows[0];
            $time_past = $zeile['time'];
            if ( $timeout + $time_past < time() ) {
                //Time has expired
                session_destroy();
                $sql = "DELETE FROM sessions WHERE session_id = '" . $session_id . "'";
                $affected = $db -> query($sql);
                $ok = FALSE;
            }
            else {
                //Time is okay
                $ok = TRUE;
                $sql = "UPDATE sessions SET time='" . time() . "' WHERE session_id = '" . $session_id . "'";
                $erg = $db -> query($sql);
                if ($erg == false) {
                    //DB error
                }
            }
        }
        else {
            //Session is new, write it to database table sessions
            $sql = "INSERT INTO sessions(session_id,time) VALUES ('".$session_id."','".time()."')";
            $res = $db->query($sql);
            if ($res === FALSE) {
                //Database error
                $ok = false;
            }
            $ok = true;
        }
        return $ok;
    }
    return $ok;
}
 9
Author: Torsten Barthel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-26 11:32:51

Zapisywanie znacznika czasu w sesji


<?php    
$user = $_POST['user_name'];
$pass = $_POST['user_pass'];

require ('db_connection.php');

// Hey, always escape input if necessary!
$result = mysql_query(sprintf("SELECT * FROM accounts WHERE user_Name='%s' AND user_Pass='%s'", mysql_real_escape_string($user), mysql_real_escape_string($pass));

if( mysql_num_rows( $result ) > 0)
{
    $array = mysql_fetch_assoc($result);    

    session_start();
    $_SESSION['user_id'] = $user;
    $_SESSION['login_time'] = time();
    header("Location:loggedin.php");            
}
else
{
    header("Location:login.php");
}
?>

Teraz sprawdź, czy znacznik czasu znajduje się w dozwolonym oknie czasu (1800 sekund to 30 minut)

<?php
session_start();
if( !isset( $_SESSION['user_id'] ) || time() - $_SESSION['login_time'] > 1800)
{
    header("Location:login.php");
}
else
{
    // uncomment the next line to refresh the session, so it will expire after thirteen minutes of inactivity, and not thirteen minutes after login
    //$_SESSION['login_time'] = time();
    echo ( "this session is ". $_SESSION['user_id'] );
    //show rest of the page and all other content
}
?>
 6
Author: Alpesh Rathod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-21 11:20:50

Proszę użyć następującego bloku kodu w pliku dołączonym, który ładuje się na każdej stronie.

$expiry = 1800 ;//session expiry required after 30 mins
    if (isset($_SESSION['LAST']) && (time() - $_SESSION['LAST'] > $expiry)) {
        session_unset();
        session_destroy();
    }
    $_SESSION['LAST'] = time();
 5
Author: lnepal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-26 06:55:45

Używanie znacznika czasu...

<?php
if (!isset($_SESSION)) {
    $session = session_start();
} 
if ($session && !isset($_SESSION['login_time'])) {
    if ($session == 1) {
        $_SESSION['login_time']=time();
        echo "Login :".$_SESSION['login_time'];
        echo "<br>";
        $_SESSION['idle_time']=$_SESSION['login_time']+20;
        echo "Session Idle :".$_SESSION['idle_time'];
        echo "<br>";
    } else{
        $_SESSION['login_time']="";
    }
} else {
    if (time()>$_SESSION['idle_time']){
        echo "Session Idle :".$_SESSION['idle_time'];
        echo "<br>";
        echo "Current :".time();
        echo "<br>";
        echo "Session Time Out";
        session_destroy();
        session_unset();
    } else {
        echo "Logged In<br>";
    }
}
?>

Wykorzystałem 20 sekund, aby zakończyć sesję za pomocą znacznika czasu .

Jeśli potrzebujesz 30 min dodaj 1800 (30 min w sekundach)...

 0
Author: Sarvan Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-05 14:06:22