1

サイトの特定のページにアクセスしたときに、非常に短いセッション (3 分) を設定する必要があります。その 3 分間のセッション中に誰かが再びそのページにアクセスした場合、セッションはその時間から 3 分後に期限切れになるように更新する必要があります。

私の「ブートストラップ」 (典型的な 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 が取得されます (ガベージ コレクションの後に別のセッション ID が削除されます)。

問題は、Cookie を取得してその時を更新しているようです。何か案は?

4

1 に答える 1

3

セッション Cookie の有効期限を更新するには、Zend_Session::rememberMe()を使用して Cookie のデフォルトの有効期間を変更します。を呼び出すrememberMe()と もZend_Session::regenerateId()呼び出され、新しいセッション ID が生成され、古いセッション データが新しいセッションにコピーされ、新しいセッション Cookie がブラウザに送信されます。

次のコードを試して、問題が解決するかどうかを確認してください。

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

詳細については、セッション識別子に関するマニュアルのセクションを参照するか、自動ログインごとに Zend rememberMe 機能をリセットする方法も参照してください。

更新: あなたのコメントを踏まえて、私はあなたが使用できるこのソリューションを思いつきました.

これが行うことは、通常どおりセッションを開始し、セッションの値をチェックして、ユーザーが既存のセッションを持っているかどうかを確認することです。

セッションがある場合は、有効期限time() + $ReservationTimeout. セッションがなかった場合は、有効期限がすでに正しいため、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']);
}

ファイルセッションハンドラーを使用してソリューションをテストしたところ、期待どおりに機能しました。あなたの状況でも問題ないと思います。

于 2012-03-28T20:55:24.220 に答える