programing

30분 후에 PHP 세션을 만료하려면 어떻게 해야 합니까?

goodjava 2022. 11. 2. 00:27

30분 후에 PHP 세션을 만료하려면 어떻게 해야 합니까?

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

세션 타임아웃을 직접 구현해야 합니다.다른 옵션(session.session_maxlife time과 session.cookie_life time) 모두 신뢰할 수 없습니다.그 이유를 설명하겠습니다.

첫 번째:

session session을 합니다.session_max 라이프 타임
session.session_maxlife time은 데이터를 'session'으로 간주하고 정리할 때까지의 초수를 지정합니다.세션 시작 중에 가비지 수집이 발생합니다.

그러나 가비지 컬렉터는 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(수정일)을 사용하고 있습니다.따라서 시간 추적을 사용할 수 없는 파일 시스템에서 문제가 발생하지 않습니다.

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

그리고 두 번째:

time session.session_sessions
session.session_displays는 브라우저로 전송되는 쿠키의 라이프타임을 초단위로 지정합니다.[…]

네, 그렇습니다.이것은 cookie의 라이프 타임에만 영향을 주고 세션 자체는 계속 유효할 수 있습니다.그러나 세션을 무효화하는 것은 서버의 작업이지 클라이언트가 아닙니다.그러니 이건 아무 도움도 안 돼요실제로 session.cookie_life time이 로 설정되어 있습니다.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적어도 이 커스텀 유효기간 핸들러의 라이프 타임과 같아야 합니다(이 예에서는 유효기간).
  • 시작 후 30분 후가 아니라 30분 에 세션을 종료하려면setcookie이 「」로 되어 .time()+60*30쿠키

30분 안에 PHP 세션이 만료되는 간단한 방법입니다.

주의: 시간을 변경하려면 원하는 시간으로 30을 변경하고 변경하지 마십시오. * 60: 그러면 회의록이 나타납니다.


단위 : * ) : (30 * 60)
n* * = days 수 ( : (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!";
        }
    }
?>

홈페이지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']);
}

편집: 뭔가 다른 의미가 있는 것 같습니다.

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

편집: ini_set('session.gc_maxlife time', 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>

를 사용합니다.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 를 참조해 주세요.

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

실제로 다음과 같은 기능으로 간단합니다.데이터베이스 테이블 이름 'sessions'와 필드 'id' 및 'time'을 사용합니다.

사용자가 사이트 또는 서비스를 다시 방문할 때마다 이 함수를 실행하여 반환 값이 TRUE인지 확인해야 합니다.FALSE일 경우 사용자가 만료되어 세션이 파기됩니다(참고:이 함수는 데이터베이스 클래스를 사용하여 데이터베이스를 연결하고 쿼리합니다.물론 함수 내에서 이 작업을 수행할 수도 있습니다.

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

세션에 타임스탬프 저장


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

다음으로 타임스탬프가 허용된 시간창(1800초는 30분) 내에 있는지 확인합니다.

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

모든 페이지에 로드된 인크루드 파일의 다음 코드 블록을 사용하십시오.

$expiry = 1800 ;//session expiry required after 30 mins
    if (isset($_SESSION['LAST']) && (time() - $_SESSION['LAST'] > $expiry)) {
        session_unset();
        session_destroy();
    }
    $_SESSION['LAST'] = time();

2014년 크리스토퍼 크레이머가 https://www.php.net/manual/en/session.configuration.php#115842에 쓴 글에서 이 글은 나를 놀라게 했다.

debian(베이스) 시스템에서는 실행 시 session.gc_maxlife time을 변경해도 실제 효과가 없습니다.Debian은 session.session_probability=0을 설정하여 PHP의 자체 가비지 컬렉터를 사용하지 않도록 설정합니다.대신 cronjob이 30분마다 실행됩니다(/etc/cron.d/php5 참조).이 작업은 오래된 세션을 청소합니다.이 cronjob은 기본적으로 php.ini를 조사하여 session.gc_maxlifetime 값을 사용하여 클리닝할 세션을 결정합니다(/usr/lib/php5/maxlifetime 참조).[...]

PHP가 세션을 처리하는 방법은 초보자가 이해하기에는 상당히 혼란스럽습니다.세션 동작의 개요에 대해 설명하면 도움이 될 수 있습니다.세션의 동작(커스텀 세션 핸들러)

이 수업을 30분 동안 사용하세요.

class Session{
    public static function init(){
        ini_set('session.gc_maxlifetime', 1800) ;
        session_start();
    }
    public static function set($key, $val){
        $_SESSION[$key] =$val;
    }
    public static function get($key){
        if(isset($_SESSION[$key])){
            return $_SESSION[$key];
        } else{
            return false;
        }
    }
    public static function checkSession(){
        self::init();
        if(self::get("adminlogin")==false){
            self::destroy();
            header("Location:login.php");
        }
    }
    public static function checkLogin(){
        self::init();
        if(self::get("adminlogin")==true){
            header("Location:index.php");
        }
    }
    public static function destroy(){
        session_destroy();
        header("Location:login.php");
    }
}

타임스탬프 사용 중...

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

타임 스탬프를 사용하여 세션을 종료하기 위해 20초를 사용했습니다.

30분이 필요한 경우 1800(초당 30분)을 추가합니다.

대체 방법으로 DB를 직접 사용할 수 있습니다.DB 함수를 사용하여 chk_lgn이라고 부릅니다.

로그인 체크를 체크하여 로그인 여부를 확인하고 로그인 시 체크 날짜 타임스탬프를 사용자의 db 행/열에 마지막으로 활성화되도록 설정합니다.

거기서도 시간 체크를 해요.지금은 모든 페이지에 이 기능을 사용하고 있기 때문에 이 기능을 사용할 수 있습니다.

추신: 제가 본 사람은 아무도 순수한 DB 솔루션을 제안하지 않았습니다.

여기서 시간을 설정할 수 있습니다.

$lifespan = 1800;
ini_set('session.gc_maxlifetime', $lifespan); //default life time

현재 시간을 저장하고 비교해서 30분을 초과하면 현재 세션을 파기합니다.

언급URL : https://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes