Pertanyaan Bagaimana cara saya mengakhiri sesi PHP setelah 30 menit?


Saya perlu menjaga sesi tetap hidup selama 30 menit dan kemudian menghancurkannya.


933
2018-02-06 13:14


asal


Jawaban:


Anda harus menerapkan batas waktu sesi Anda sendiri. Kedua opsi yang disebutkan oleh orang lain (session.gc_maxlifetime dan session.cookie_lifetime) tidak dapat diandalkan. Saya akan menjelaskan alasannya.

Pertama:

session.gc_maxlifetime
session.gc_maxlifetime menentukan jumlah detik setelah data akan dilihat sebagai 'sampah' dan dibersihkan. Pengumpulan sampah terjadi saat sesi dimulai.

Tapi pengumpul sampah hanya dimulai dengan probabilitas session.gc_probability dibagi dengan session.gc_divisor. Dan menggunakan nilai default untuk opsi tersebut (masing-masing 1 dan 100), peluangnya hanya 1%.

Nah, Anda bisa menyesuaikan nilai-nilai ini sehingga pengumpul sampah dimulai lebih sering. Tetapi ketika pengumpul sampah dimulai, ia akan memeriksa validitas untuk setiap sesi terdaftar. Dan itu adalah biaya intensif.

Selanjutnya, saat menggunakan PHP default session.save_handler file, data sesi disimpan dalam file di jalur yang ditentukan dalam session.save_path. Dengan handler sesi tersebut, usia data sesi dihitung pada tanggal modifikasi terakhir file dan bukan tanggal akses terakhir:

catatan: Jika Anda menggunakan pengendali sesi berbasis file standar, sistem file Anda harus melacak waktu akses (atime). Windows FAT tidak sehingga Anda harus datang dengan cara lain untuk menangani pengumpulan sampah sesi Anda jika Anda terjebak dengan filesystem FAT atau sistem file lainnya di mana pelacakan atime tidak tersedia. Sejak PHP 4.2.3 telah menggunakan mtime (tanggal modifikasi) bukan atime. Jadi, Anda tidak akan memiliki masalah dengan sistem file di mana pelacakan atime tidak tersedia.

Jadi itu juga mungkin terjadi bahwa file data sesi dihapus sementara sesi itu sendiri masih dianggap valid karena data sesi tidak diperbarui baru-baru ini.

Dan kedua:

session.cookie_lifetime
session.cookie_lifetime menentukan umur cookie dalam detik yang dikirim ke browser. [...]

Ya itu betul. Ini hanya memengaruhi masa pakai cookie dan sesi itu sendiri mungkin masih berlaku. Tapi itu tugas server untuk membatalkan sesi, bukan klien. Jadi ini tidak membantu apa-apa. Faktanya, memiliki session.cookie_lifetime mulai 0 akan membuat cookie sesi menjadi nyata cookie sesi itu hanya berlaku sampai browser ditutup.

Kesimpulan / solusi terbaik:

Solusi terbaik adalah menerapkan batas waktu sesi Anda sendiri. Gunakan stempel waktu sederhana yang menunjukkan waktu aktivitas terakhir (yaitu permintaan) dan perbarui dengan setiap permintaan:

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

Memperbarui data sesi dengan setiap permintaan juga mengubah tanggal modifikasi file sesi sehingga sesi tidak dihapus oleh pengumpul sampah sebelum waktunya.

Anda juga dapat menggunakan stempel waktu tambahan untuk meregenerasi ID sesi secara berkala untuk menghindari serangan pada sesi seperti fiksasi sesi:

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
}

Catatan:

  • session.gc_maxlifetime harus setidaknya sama dengan masa pakai penangan waktu khusus ini (1800 dalam contoh ini);
  • jika Anda ingin mengakhiri sesi setelah 30 menit aktivitas bukannya setelah 30 menit sejak awal, Anda juga harus menggunakannya setcookie dengan kedaluwarsa time()+60*30 untuk menjaga cookie sesi aktif.

1519
2017-08-13 09:24



Cara sederhana berakhirnya sesi PHP dalam 30 menit.

Catatan: jika Anda ingin mengubah waktu, cukup ubah 30 dengan waktu yang Anda inginkan dan jangan ubah * 60: ini akan memberikan menit.


Dalam hitungan menit: (30 * 60)
Dalam beberapa hari: (n * 24 * 60 * 60) n = tidak ada hari


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

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

113
2017-09-13 06:39



Apakah ini untuk membuat pengguna keluar setelah waktu yang ditentukan? Menetapkan waktu pembuatan sesi (atau waktu kedaluwarsa) saat terdaftar, dan kemudian memeriksa bahwa pada setiap pemuatan halaman dapat mengatasinya.

Misalnya.:

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

// later

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

Edit: Saya punya perasaan Anda berarti sesuatu yang lain.

Anda dapat menghapus sesi setelah jangka waktu tertentu dengan menggunakan session.gc_maxlifetime Penyetelan ini:

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


33
2018-02-06 13:20



Posting ini menunjukkan beberapa cara mengendalikan batas waktu sesi: http://bytes.com/topic/php/insights/889606-setting-timeout-php-sessions

IMHO opsi kedua adalah solusi yang bagus:

<?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



Yah saya mengerti jawaban di atas benar tetapi mereka berada pada tingkat aplikasi, mengapa tidak kita gunakan saja .htaccess file untuk mengatur waktu kedaluwarsa?

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

16
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



Menggunakan session_set_cookie_paramsfunciton untuk membuat ini.

Perlu memanggil fungsi ini sebelumnya session_start() panggilan.

Coba ini:

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

session_set_cookie_params($lifetime);

session_start();

Lihat lebih lanjut di: http://php.net/manual/function.session-set-cookie-params.php


11
2018-05-13 12:43