Nasıl 30 dakika sonra bir PHP oturum sona mı?

5 Cevap php

Ben 30 dakika boyunca canlı bir oturumu tutmak ve sonra onu yok etmek gerekir.

5 Cevap

Kendi üzerinde bir oturum zaman aşımı uygulamak gerekir. Diğerleri (session.gc_maxlifetime and session.cookie_lifetime ) tarafından bahsedilen her iki seçenek de güvenilir değildir. Bunun nedenini açıklayacağım.

Birincisi:

session.gc_maxlifetime
session.gc_maxlifetime specifies the number of seconds after which data will be seen as 'garbage' and cleaned up. Garbage collection occurs during session start.

Ama çöp toplayıcı sadece session.gc_probability divided by session.gc_divisor bir olasılık ile başladı. Ve bu seçenekleri (1 ve 100, sırasıyla) için varsayılan değerleri kullanarak, şansı sadece% 1 olduğunu.

Peki, çöp toplayıcı daha sık başladı, böylece sadece bu değerleri ayarlamak için ileri sürülebilir. Çöp toplayıcı başlatıldığında Ama her kayıtlı oturum için geçerliliğini kontrol edecektir. Ve bu maliyet-yoğundur.

PHP'nin varsayılan session save handler files kullanırken Dahası, oturum verileri session.save_path belirtilen bir yolda dosyalarında saklanır. Bu oturum eylemci ile oturum verilerinin yaş dosyanın son değiştirilme tarihi ve değil son erişim tarihine göre hesaplanır:

Eğer varsayılan dosya dayalı oturum yönetimini kullanıyorsanız Note:, sizin dosya sistemi erişim zamanlarını (atime) izlemek gerekir. Windows FAT böylece size bir FAT dosya sistemi veya atime mevcut değil başka bir dosya sistemi ile sıkışmış eğer oturumu toplama çöp işlemek için başka bir yol ile gelmek zorunda değildir. PHP 4.2.3 'ten beri mtime (değiştirilme tarihi) atime yerine kullandı. Yani, atime mevcut değildir dosya sistemlerinde sorun olmaz.

Oturum verileri son zamanlarda güncellenen değildi çünkü oturum kendisi hala geçerli olarak kabul ederken bu yüzden ek bir oturum veri dosyası silinir olduğunu oluşabilir.

Ve ikincisi:

session.cookie_lifetime
session.cookie_lifetime specifies the lifetime of the cookie in seconds which is sent to the browser. […]

Evet, bu doğru. Bu sadece çerez ömrünü ve kendisi hala geçerli olabilir oturumu etkilemez. Ama bir oturumu geçersiz sunucunun görev değil, müşterinin. Yani bu hiçbir işe yaramaz. Aslında, session.cookie_lifetime 0 oturumun çerez yapacak için ayarlanmış olan bir tarayıcı kapatılıncaya kadar gerçek session cookie sadece geçerlidir.

Yani sonuçlandırmak için: En iyi çözüm kendi üzerinde bir oturum zaman aşımı uygulamaktır. Son etkinlik (yani istek) zamanını gösterir basit bir zaman damgası kullanın ve her isteği ile güncelleyin:

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

Oturumu zamanından önce çöp toplayıcı tarafından kaldırılmaz böylece her istek ile oturum verilerini güncellemek oturum dosyanın değiştirme tarihini değiştirebilirsiniz gelmez.

Ayrıca gibi oturumlar saldırıları önlemek için periyodik oturum kimliğini yenilemek için ek bir zaman damgası kullanın session fixation yapabilirsiniz:

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 an invalidate old session ID
    $_SESSION['CREATED'] = time();  // update creation time
}

session.gc_maxlifetime (bu örnekte 1800) bu özel sona erme işleyici yaşam süresi en azından eşit olması gerektiğini unutmayın.

Simple way of PHP session expiry in 30 minutes.

Not: Eğer süreyi değiştirmek istiyorsanız, sadece istediğiniz zaman değiştirebilir ve 30 * 60 değiştirmeyin: Bu irade dakika verir.


In minutes : (30 * 60)
In days : (n * 24 * 60 * 60 ) n = no of days


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

Bu, belirli bir süre sonra kullanıcı oturum mı? Her sayfa yük olmadığını kontrol sonra kayıtlı ve ne zaman oturum oluşturma süresini (veya geçerlilik süresi), bu ayarı ele verebilir.

Örneğin:

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

// later

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

Edit: Ben olsa başka bir şey demek bir his var.

Sen session.gc_maxlifetime ini ayarını kullanarak belli bir ömrü sonra oturumları hurda olabilir:

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

session_cache_expire(30);
$cache_expire = session_cache_expire();
session_start();
echo "The cache limiter is now set to $cache_limiter<br />";
echo "The cached session pages expire after $cache_expire minutes";

Bu bak documentation.

Bu aşağıdaki gibi bir işlevi ile aslında kolay. Bu alanlar 'id' ve 'zaman' ile veritabanı tablo adı 'oturumları' kullanır.

Kullanıcı sitenizi veya hizmet ziyaretleri her zaman tekrar dönüş değeri DOĞRU olup olmadığını kontrol etmek için bu fonksiyonu çağırmak gerekir. FALSE ise kullanıcı süresi doldu ve oturumu yok edilecek (Not: Bu fonksiyon, tabii siz de işlev veya iç bir şey yapabileceğini, veritabanına bağlanmak ve sorgulamak için bir veritabanı sınıfı kullandığı gibi.):

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;
}