2012-03-28 3 views
1

私のサイトの特定のページを押すと非常に短いセッション(3分)を設定する必要があります。その3分のセッション中に誰かがそのページに再び当たった場合、セッションはその時間から3分経過すると更新されます。私の「ブートストラップ」でZend_SessionとExpiration

(それは典型的なZendのブートストラップではありませんが、それはすべてのページに含まれている)、私は次のようにします。そして、

$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を取得します(もう1つはガベージコレクションの後に削除されます。

問題は、クッキーが時間を更新するようになっているようです。何か案は?

答えて

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を含む)を使用して更新セッションCookieを送信します。彼らがセッションを持っていない場合、有効期限はすでに正しいので、クッキーを更新する必要はなく、次回の要求時に更新されます(期限前に訪問したと仮定して)。

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

関連する問題