복붙노트

어떻게 PHP에서 세션 시간 초과를 변경하려면?

PHP

어떻게 PHP에서 세션 시간 초과를 변경하려면?

나는 PHP에서 세션 시간 초과를 연장하고 싶습니다

php.ini 파일을 수정하여 그렇게 할 수 있음을 알고 있습니다. 그러나 나는 그것에 접근 할 수 없다.

그래서 그것은 PHP 코드에서만 가능합니까?

해결법

  1. ==============================

    1.

    세션 타임 아웃은 엄격한 보증을 원할 경우 코드로 구현해야하는 개념입니다. 이것이 X 분 동안 활동하지 않으면 세션이 생존 할 수 없다는 것을 확신 할 수있는 유일한 방법입니다.

    이 요구 사항을 조금이라도 완화하면 수용 할 수 있으며 기간에 대한 엄격한 제한 대신 하한을 설정하는 것이 좋으며 사용자 지정 논리를 작성하지 않고도 그렇게 쉽게 수행 할 수 있습니다.

    세션이 쿠키로 구현되어 있고 클라이언트가 악의적이지 않은 경우 특정 매개 변수를 조정하여 세션 기간의 상한을 설정할 수 있습니다. 쿠키로 PHP의 기본 세션 처리를 사용하는 경우 session.gc_maxlifetime과 session_set_cookie_params를 다음과 같이 설정해야합니다.

    // server should keep session data for AT LEAST 1 hour
    ini_set('session.gc_maxlifetime', 3600);
    
    // each client should remember their session id for EXACTLY 1 hour
    session_set_cookie_params(3600);
    
    session_start(); // ready to go!
    

    이것은 적어도 1 시간 동안 활동하지 않는 동안 세션 데이터를 유지하고 동일한 시간 간격 후에 세션 ID를 잊어 버리도록 클라이언트에게 지시하도록 서버를 구성하여 작동합니다. 예상되는 결과를 얻으려면이 두 단계가 모두 필요합니다.

    사용자 정의 로직을 사용하여 세션 비활성 상태의 상한선을 배치함으로써 작업을 완벽하게 제어 할 수 있습니다. 위에서 아래쪽 경계와 함께 엄격한 설정이됩니다.

    상한을 나머지 세션 데이터와 함께 저장하면됩니다 :

    session_start(); // ready to go!
    
    $now = time();
    if (isset($_SESSION['discard_after']) && $now > $_SESSION['discard_after']) {
        // this session has worn out its welcome; kill it and start a brand new one
        session_unset();
        session_destroy();
        session_start();
    }
    
    // either new or old, it should live at most for another hour
    $_SESSION['discard_after'] = $now + 3600;
    

    지금까지 우리는 각 세션 id의 정확한 값을 염두에 두지 않았고, 필요로하는 한 데이터가 존재해야한다는 요구 사항 만 가지고있었습니다. (있을 법하지 않은) 세션 ID가 중요 할 경우에는 필요할 때 session_regenerate_id를 사용하여 세션 ID를 다시 생성해야합니다.

  2. ==============================

    2.

    PHP의 기본 세션 처리를 사용하는 경우, 모든 플랫폼에서 세션 기간을 확실하게 변경하는 유일한 방법은 php.ini를 변경하는 것입니다. 일부 플랫폼에서는 가비지 수집이 php.ini에서 직접 읽는 모든 특정 시간 (cron 스크립트)을 실행하는 스크립트를 통해 구현되기 때문에 런타임에이를 변경하려는 시도가 있기 때문입니다. via ini_set ()는 신뢰할 수 없으며 작동하지 않을 가능성이 큽니다.

    예를 들어 데비안 리눅스 시스템에서는 XX : 09와 XX : 39 (30 분마다)에서 실행되는 /etc/cron.d/php5를 통해 가비지 수집이 이루어지며 세션보다 오래된 세션이 발견되면 .gc_maxlifetime이 php.ini에 지정되어 있으면 해당 세션은 자비없이 삭제됩니다. 또한이 질문에서 PHP 세션이 너무 빨리 시간 초과 됨, OP가 한 호스트에서 문제가 있었지만 다른 호스트로 전환 할 때 문제가 중단되었음을 설명합니다.

    따라서, php.ini에 접근 할 수 없다는 점을 감안할 때, 이식성있게하고 싶다면 기본 세션 처리를 사용하는 것은 옵션이 아닙니다. 분명히 쿠키 수명을 연장하는 것은 호스트에 충분했지만 호스트를 전환하더라도 안정적으로 작동하는 솔루션을 원한다면 다른 대안을 사용해야합니다.

    사용할 수있는 대체 방법은 다음과 같습니다.

    session_set_save_handler ()에 대한 설명서에는 (1)의 예제가 있습니다. 이 예제는 길지만 여기서 세션 기간을 연장하는 데 필요한 관련 수정 사항을 사용하여이를 재현합니다. 쿠키 수명을 늘리기 위해 session_set_cookie_params ()를 포함 시켰습니다.

    <?php
    class FileSessionHandler
    {
    
        private $savePath;
        private $lifetime;
    
        function open($savePath, $sessionName)
        {
            $this->savePath = 'my_savepath'; // Ignore savepath and use our own to keep it safe from automatic GC
            $this->lifetime = 3600; // 1 hour minimum session duration
            if (!is_dir($this->savePath)) {
                mkdir($this->savePath, 0777);
            }
    
            return true;
        }
    
        function close()
        {
            return true;
        }
    
        function read($id)
        {
            return (string)@file_get_contents("$this->savePath/sess_$id");
        }
    
        function write($id, $data)
        {
            return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
        }
    
        function destroy($id)
        {
            $file = "$this->savePath/sess_$id";
            if (file_exists($file)) {
                unlink($file);
            }
    
            return true;
        }
    
        function gc($maxlifetime)
        {
            foreach (glob("$this->savePath/sess_*") as $file) {
                if (filemtime($file) + $this->lifetime < time() && file_exists($file)) { // Use our own lifetime
                    unlink($file);
                }
            }
    
            return true;
        }
    }
    
    $handler = new FileSessionHandler();
    session_set_save_handler(
        array($handler, 'open'),
        array($handler, 'close'),
        array($handler, 'read'),
        array($handler, 'write'),
        array($handler, 'destroy'),
        array($handler, 'gc')
        );
    
    // the following prevents unexpected effects when using objects as save handlers
    register_shutdown_function('session_write_close');
    
    session_set_cookie_params(3600); // Set session cookie duration to 1 hour
    session_start();
    // proceed to set and retrieve values by key from $_SESSION
    

    접근법 (2)는 더 복잡합니다. 기본적으로 모든 세션 기능을 스스로 다시 구현해야합니다. 여기에 대해서는 자세히 설명하지 않겠습니다.

  3. ==============================

    3.

    PHP 스크립트에서 session.gc_maxlifetime을 설정하면 Plesk가 cron에서 실행되는 자체 가비지 수집 스크립트를 가지고 있기 때문에 Plesk를 사용하는 모든 사람에게 댓글을 추가하는 것은 미친 듯이 나를 괴롭혔습니다.

    이 문제를 피하기 위해 cron 작업을 시간별에서 일별로 이동시키는 아래의 링크에 게시 된 솔루션을 사용했습니다. 위의 대답이 효과가 있습니다.

    mv /etc/cron.hourly/plesk-php-cleanuper /etc/cron.daily/
    

    https://websavers.ca/plesk-php-sessions-timing-earlier-expected

  4. ==============================

    4.

    Put $ _SESSION [ 'login_time'] = 시간 (); 이전 인증 페이지로 이동하십시오. 그리고 세션 시간 제한을 확인하려는 다른 모든 페이지에서 아래에있는 내용을 잘랐습니다.

    if(time() - $_SESSION['login_time'] >= 1800){        
        header("Location: logout.php");
        //redirect if the page is inactive for 30 minutes
    }
    else {        
       $_SESSION['login_time'] = time();
       // update value of session
    }
    
  5. ==============================

    5.

    아니. php.ini에 접근 할 수 없다면 변경 사항이 어떤 영향을 미치는지 보장 할 수 없습니다.

    나는 당신이 당신의 세션 시간을 연장 할 필요가 있다고 생각하지 않습니다. 지금은 꽤 현명한 타임 아웃을 가지고 있으며 확장 할 이유가 없습니다.

  6. ==============================

    6.

    ini_set ()을 사용하여 PHP 코드에서 php.ini의 값을 재정의 할 수 있습니다.

  7. from https://stackoverflow.com/questions/8311320/how-to-change-the-session-timeout-in-php by cc-by-sa and MIT lisence