Php 在会话启动后更改gc_max_生存期

Php 在会话启动后更改gc_max_生存期,php,zend-framework,session,garbage-collection,remember-me,Php,Zend Framework,Session,Garbage Collection,Remember Me,我处于一种(独特的?)情况下,我希望登录的人尽可能长时间保持登录状态。理想情况下,一个月(市场营销部需要一年)。我们将会话数据存储在数据库中,而不是默认文件中 我们不存储任何个人信息或任何其他可能存在安全风险的信息 我遇到的问题是,我不想在表中累积成吨的会话数据,从而影响服务器延迟。为了做到这一点,我想在匿名状态下将某人的会话存储86400秒(1天),但一旦他们登录后,将其更改为2592000秒(30天) 我正在使用zend framework 1.12,我的application.ini如下所

我处于一种(独特的?)情况下,我希望登录的人尽可能长时间保持登录状态。理想情况下,一个月(市场营销部需要一年)。我们将会话数据存储在数据库中,而不是默认文件中

我们不存储任何个人信息或任何其他可能存在安全风险的信息

我遇到的问题是,我不想在表中累积成吨的会话数据,从而影响服务器延迟。为了做到这一点,我想在匿名状态下将某人的会话存储86400秒(1天),但一旦他们登录后,将其更改为2592000秒(30天)

我正在使用zend framework 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”,但一旦我登录,它就不会改变。我假设memberme不同于垃圾收集,我一个月的memberme毫无意义,因为它将在一天后被收集,从而破坏会话。所以,我尝试在登录时修改它。以下是我的登录逻辑:

    $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"

对于数据库支持的会话,您可以专门控制会话删除的行为
gc_max_life
只是一个传递给
gc()
会话处理程序函数的参数。您可以随意使用或忽略它。你只需要使用你想要的逻辑

例如,您可以简单地向数据库添加一个字段,以确定这是“长”会话还是“短”会话。然后相应地更改删除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))
从会话中删除
哪里
(long_session=1和timestamp_字段

如果要使用传递给
gc()

gc\u max\u liferate
值,也可以使用INTERVAL X SECONDS。我在使用会话表中的自定义列使用Zend的会话工具时遇到了困难。但这个答案激励我在他们登录时更新会话。不幸的是,我也无法使用登录会话的相同逻辑更新会话。因此,我设置了一个会话变量,并在下一页加载时检查它:`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'>`