2012-03-28 2 views
1

내 사이트의 특정 페이지를 클릭 할 때 매우 짧은 세션 (3 분)을 설정해야합니다. 3 분 동안 다른 사람이 해당 페이지를 다시 방문하면 해당 시간에서 3 분이 지나면 세션이 만료됩니다. 내, 내가 다음을 수행합니다 (이것은 일반적인 젠드 부트 스트랩 아니지만,이 모든 페이지에 포함되어 있습니다) "부트 스트랩"에Zend_Session 및 만료

:

$aSessionSaveHandlerConfig = array 
(
    "name"   => "Sessions", 
    "primary"  => "Session_ID", 
    "modifiedColumn" => "UpdateTimestamp", 
    "dataColumn"  => "Data", 
    "lifetimeColumn" => "Lifetime", 
); 

$oSaveHandler = new Zend_Session_SaveHandler_DbTable($aSessionSaveHandlerConfig); 
$oSaveHandler->setLifetime(App::$ReservationTimeout)->setOverrideLifetime(true);  

Zend_Session::setSaveHandler($oSaveHandler); 

ini_set("session.cookie_lifetime",App::$ReservationTimeout); 

$aSessionOptions = array 
(
    "gc_probability" => 100, 
    "gc_divisor"  => 100, 
    "gc_maxlifetime" => App::$ReservationTimeout, 
    "cookie_lifetime" => App::$ReservationTimeout, 
); 

Zend_Session::setOptions($aSessionOptions); 

다음 만들어야 페이지 내/업데이트 세션, 내가 가진 :

App::$ReservationSession = new Zend_Session_Namespace("ReservationSession"); 
$oSaveHandler = Zend_Session::getSaveHandler(); 
$oSaveHandler->setLifetime(App::$ReservationTimeout); 

나는 데이터베이스에 레코드를 참조 수명 열이 올바른지,하지만 난 반복/세션을 갱신 생성 페이지를 치면로 3 분 통과 후, 나는 새로운 세션 ID를 얻을 수 (다른 하나는 쓰레기 수거 후 제거됩니다.)

쿠키가 시간을 업데이트하는 데 문제가있는 것으로 보입니다. 어떤 아이디어?

답변

3

만료 시간을 업데이트하기 위해 세션 쿠키를 얻으려면 Zend_Session::rememberMe()을 사용하여 쿠키의 기본 수명을 변경할 수 있습니다. rememberMe()을 호출하면 Zend_Session::regenerateId()이 호출되어 새 세션 ID가 생성되고 이전 세션 데이터가 새 세션에 복사되며 브라우저에 새 세션 쿠키가 전송됩니다. 이 문제가 해결되는지

다음 코드를 시도하고 참조 :

App::$ReservationSession = new Zend_Session_Namespace("ReservationSession"); 
$oSaveHandler = Zend_Session::getSaveHandler(); 
$oSaveHandler->setLifetime(App::$ReservationTimeout); 

// Call remember me which will send a new session cookie with 3 minute expiration 
// from the current time. Old session data is copied to the new one and the old 
// session is deleted 
Zend_Session::rememberMe(App::$ReservationTimeout); 

자세한 내용은 Session Identifiers 매뉴얼 섹션을 참조하거나도 참조 How to reset a Zend rememberMe function on each automatic login?

UPDATE : 당신의 코멘트를 감안할 때, 나는 당신이 사용할 수있는이 솔루션을 생각해 냈습니다.

일반적으로 세션을 시작한 다음 세션의 값을 검사하여 사용자가 기존 세션을 가지고 있는지 확인합니다.

세션이있는 경우 time() + $ReservationTimeout으로 만료를 설정한다는 점을 제외하고는 setcookie()을 사용하여 기존 매개 변수 (세션 ID 포함)를 사용하여 업데이트 된 세션 쿠키를 보냅니다. 세션이없는 경우 만료가 이미 정확하며 다음 요청시 업데이트됩니다 (만료되기 전에 방문한다고 가정 함). 쿠키를 업데이트 할 필요가 없습니다.

App::$ReservationSession = new Zend_Session_Namespace("ReservationSession"); 
$oSaveHandler = Zend_Session::getSaveHandler(); 
$oSaveHandler->setLifetime(App::$ReservationTimeout); 

if (!isset(App::$ReservationSession->hasSession)) { 
    // user had no session before or it was expired 
    App::$ReservationSession->hasSession = true; 
} else { 
    // user has a valid session, update the cookie to expire 3 mins from now 
    $params = session_get_cookie_params(); 
    $expire = time() + App::$ReservationTimeout; 

    setcookie(session_name(), 
       Zend_Session::getId(), 
       $expire, 
       $params['path'], 
       $params['domain'], 
       $params['secure'], 
       $params['httponly']); 
} 

나는 파일 세션 핸들러를 사용하여 솔루션을 테스트하고 예상대로, 나는 그것뿐만 아니라 상황에 잘해야한다고 생각했다.

+0

대단한 설명이지만 세션 ID를 사용하는 MySQL InnoDB 외래 키 제약 조건이 있으므로 타임 아웃을 업데이트 할 때 동일한 세션 ID를 유지해야합니다. 세션 ID를 변경하지 않고 기억하는 것을 할 수 있습니까? – Travis