0

私は、ログインしているユーザーにできるだけ長くログインしたままにしてもらいたい (独特の?) 状況にあります。理想的には、1 か月です (マーケティングでは 1 年が必要でした)。デフォルトのファイルではなく、データベースにセッション データを保存しています。

私たちは、個人情報やセキュリティ上のリスクとなるその他のものを保存しません。

私が直面している問題は、大量のセッション データをテーブルに蓄積して、それがサーバーの遅延に影響を与えたくないということです。そのためには、誰かのセッションを匿名で 86400 秒 (1 日) 保存したいのですが、ログインしたら 2592000 秒 (30 日) に変更します。

私は zend フレームワーク 1.12 を使用しており、application.ini は次のようになっています。

resources.session.gc_maxlifetime = 86400
resources.session.remember_me_seconds = 2592000
resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable"
resources.session.saveHandler.options.name = "session"
resources.session.saveHandler.options.primary[] = "session_id"
resources.session.saveHandler.options.primary[] = "save_path"
resources.session.saveHandler.options.primary[] = "name"
resources.session.saveHandler.options.primaryAssignment[] = "sessionId"
resources.session.saveHandler.options.primaryAssignment[] = "sessionSavePath"
resources.session.saveHandler.options.primaryAssignment[] = "sessionName"
resources.session.saveHandler.options.modifiedColumn = "modified"
resources.session.saveHandler.options.dataColumn = "session_data"
resources.session.saveHandler.options.lifetimeColumn = "lifetime"

初めてサイトにアクセスしたとき、ライフタイムは「86400」に設定されていますが、ログインすると変更されません。私は、remember_me はガベージ コレクションとは異なり、1 日後に収集されてセッションが破壊されるため、私の 1 か月間の remember_me は無意味であると想定しています。ということで、ログイン時に修正してみました。これが私のログインロジックです:

    $adapter = new Activejunky_Auth_Adapter_Doctrine($values['username'], $values['password']);
    $auth = Zend_Auth::getInstance();
    $sessionOptions = array(
        'gc_maxlifetime'            => 2592000,
        'remember_me_seconds'   => 2592000,
    );
    Zend_Session::setOptions($sessionOptions);
    Zend_Session::rememberMe(60 * 60 * 24 * 30);
    error_log('you working?');
    Zend_Session::start();

    $result = $auth->authenticate($adapter);

    if ( $result->isValid() )
    {
        $user = $adapter->getResultObject();
        $user->last_login = time();
        $user->save();

        //STORE USER INFO
        $authStorage = $auth->getStorage();
        $authStorage->write($user->toArray());

それは、しかし、まだ動作しません。私は問題なくログインしていますが、ライフタイムはまだ 86400 に設定されています。これを行う方法はありますか? それとも私は試してみても気が狂っていますか?

編集

読みやすいので、これが私がやったことです。ログイン後のページ:

            $aj = new Zend_Session_Namespace('aj');
            if($aj->lifetime == 'day')
        {
            $db = Zend_Db_Table::getDefaultAdapter();
            $sid = Zend_Session::getId();
            $where = $db->quoteInto('session_id = ?', Zend_Session::getId());
            $db->update('session', array('lifetime' => 2592000), $where);
            $aj->lifetime = 'month';
        }

そして、ここに私のapplication.iniがあります:

resources.session.gc_maxlifetime = 7200
resources.session.remember_me_seconds = 2592000
resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable"
resources.session.saveHandler.options.name = "session"
resources.session.saveHandler.options.primary[] = "session_id"
resources.session.saveHandler.options.primary[] = "save_path"
resources.session.saveHandler.options.primary[] = "name"
resources.session.saveHandler.options.primaryAssignment[] = "sessionId"
resources.session.saveHandler.options.primaryAssignment[] = "sessionSavePath"
resources.session.saveHandler.options.primaryAssignment[] = "sessionName"
resources.session.saveHandler.options.modifiedColumn = "modified"
resources.session.saveHandler.options.dataColumn = "session_data"
resources.session.saveHandler.options.lifetimeColumn = "lifetime"
resources.view.doctype = "HTML5"
resources.view.language = "en"
4

1 に答える 1

0

データベースがサポートするセッションの場合、セッション削除の動作を具体的に制御できます。 セッション ハンドラ関数gc_max_lifetimeに渡される単なるパラメータです。gc()必要に応じて使用または無視できます。必要なロジックを使用するだけです。

たとえば、データベースにフィールドを追加するだけで、これが「長い」セッションか「短いセッション」かを判断できます。次に、それに応じて DELETE SQL を変更します。だから、このようなもの:

DELETE FROM sessions
WHERE
    (long_session = 1 AND timestamp_field < DATE_SUB(NOW(), INTERVAL 30 DAYS)) OR
    (long_session = 0 AND timestamp_filed < DATE_SUB(NOW(), INTERVAL 1 DAY))

gc_max_lifetimeここで、 に渡された値を使用したい場合は、INTERVAL X SECONDS も使用できますgc()

于 2013-07-30T00:52:36.253 に答える