[php] 30 분 후에 PHP 세션을 어떻게 만료합니까?

세션을 30 분 동안 유지 한 다음 파기해야합니다.



답변

자신 만의 세션 시간 초과를 구현해야합니다. 다른 사람들이 언급 한 두 가지 옵션 ( session.gc_maxlifetimesession.cookie_lifetime )은 신뢰할 수 없습니다. 그 이유를 설명하겠습니다.

먼저:

session.gc_maxlifetime
session.gc_maxlifetime 은 데이터가 ‘쓰레기’로 표시되고 정리되는 시간 (초)을 지정합니다. 세션 시작 중에 가비지 콜렉션이 발생합니다.

그러나 가비지 컬렉터 만의 확률로 시작 session.gc_probability 로 나눈 session.gc_divisor는 . 이러한 옵션의 기본값 (각각 1과 100)을 사용하면 기회는 1 %에 불과합니다.

가비지 수집기가 더 자주 시작되도록 이러한 값을 간단히 조정할 수 있습니다. 그러나 가비지 수집기가 시작되면 등록 된 모든 세션의 유효성을 검사합니다. 그리고 그것은 비용 집약적입니다.

또한 PHP의 기본 session.save_handler 파일을 사용할 때 세션 데이터는 session.save_path에 지정된 경로의 파일에 저장됩니다 . 해당 세션 핸들러를 사용하면 세션 데이터의 수명이 마지막 액세스 날짜가 아니라 파일의 마지막 수정 날짜에 계산됩니다.

참고 : 기본 파일 기반 세션 핸들러를 사용하는 경우 파일 시스템은 액세스 시간을 추적해야합니다 (한 번). Windows FAT는 시간 추적을 사용할 수없는 FAT 파일 시스템 또는 다른 파일 시스템에 갇혀있는 경우 세션을 가비지 수집을 처리하는 다른 방법을 생각해 내야합니다. PHP 4.2.3부터는 atime 대신 mtime (수정 된 날짜)을 사용했습니다. 따라서 시간 추적을 사용할 수없는 파일 시스템에는 문제가 없습니다.

따라서 세션 데이터가 최근에 업데이트되지 않았기 때문에 세션 자체가 여전히 유효한 것으로 간주되는 동안 세션 데이터 파일이 삭제 될 수 있습니다.

그리고 두 번째 :

session.cookie_lifetime
session.cookie_lifetime 은 브라우저에 전송되는 쿠키 수명을 초 단위로 지정합니다. […]

네 맞습니다. 이는 쿠키 수명에만 영향을 미치며 세션 자체는 여전히 유효합니다. 그러나 클라이언트가 아닌 세션을 무효화하는 것은 서버의 작업입니다. 그래서 이것은 아무것도 도움이되지 않습니다. 실제로 session.cookie_lifetime을 설정하면 세션 쿠키 를 브라우저를 닫을 때까지만 유효한 0실제 세션 쿠키로 만들 수 있습니다.

결론 / 최상의 솔루션 :

가장 좋은 솔루션은 자신의 세션 시간 초과를 구현하는 것입니다. 마지막 활동 시간 (예 : 요청)을 나타내는 간단한 타임 스탬프를 사용하고 모든 요청으로 업데이트하십시오.

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

요청이있을 때마다 세션 데이터를 업데이트하면 가비지 수집기에서 세션이 조기에 제거되지 않도록 세션 파일의 수정 날짜도 변경됩니다.

세션 수정과 같은 세션 에 대한 공격을 피하기 위해 추가 타임 스탬프를 사용하여 세션 ID를 주기적으로 다시 생성 할 수도 있습니다 .

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
}

노트:

  • session.gc_maxlifetime 이 사용자 정의 만기 핸들러 (이 예제에서는 1800)의 수명과 최소한 같아야합니다.
  • start 이후 30 분이 아닌 30 분 동안 활동 한 후 세션을 만료 하려면 세션 쿠키를 활성 상태로 유지하기 위해 만료와 함께 사용해야 합니다.setcookietime()+60*30

답변

30 분 안에 간단한 PHP 세션 만료 방법.

참고 : 시간을 변경하려면 원하는 시간으로 30을 변경하고 * 60을 변경하지 마십시오. 분이 표시됩니다.


분 단위 : (30 * 60)
일 단위 : (n * 24 * 60 * 60) n = 일 수


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


답변

설정된 시간 후에 사용자를 로그 아웃합니까? 등록시 세션 작성 시간 (또는 만료 시간)을 설정 한 다음 각 페이지로드에서이를 처리 할 수 ​​있는지 확인하십시오.

예 :

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

// later

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

편집 : 나는 당신이 다른 것을 의미한다고 생각합니다.

session.gc_maxlifetimeini 설정 을 사용하여 특정 수명 후 세션을 폐기 할 수 있습니다 .

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


답변

이 포스트는 세션 타임 아웃을 제어하는 ​​몇 가지 방법을 보여줍니다 : http://bytes.com/topic/php/insights/889606-setting-timeout-php-sessions

IMHO 두 번째 옵션은 훌륭한 솔루션입니다.

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


답변

글쎄, 위의 답변이 정확하지만 응용 프로그램 수준에 있다는 것을 이해합니다. .htaccess파일을 사용하여 만료 시간을 설정 하지 않는 이유는 무엇입니까?

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


답변

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


답변

session_set_cookie_params기능을 사용하려면 기능을 사용하십시오.

호출하기 전에이 기능을 session_start()호출 해야 합니다.

이 시도:

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

session_set_cookie_params($lifetime);

session_start();

자세한 내용은 http://php.net/manual/function.session-set-cookie-params.php를 참조하십시오.