2013-07-30 36 views
0

我處於(唯一的?)情況,我希望登錄的人儘可能保持登錄狀態。理想情況下,一個月(營銷需要一年)。我們將會話數據存儲在數據庫中,而不是默認文件。更改gc_max_lifetime會話啓動後

我們不存儲任何個人信息或任何其他可能存在安全風險的內容。

我遇到的問題是我不想在表中堆積大量的會話數據並影響服務器延遲。爲了做到這一點,我想以匿名方式儲存某人的會話時間爲86400秒(1天),但在登錄後將其更改爲2592000秒(30天)。

I'米使用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」,但一旦我登錄它不會改變。我認爲remember_me與垃圾收集不同,而且我的一個月的記憶_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" 

回答

0

對於數據庫備份會話,您可以具體控制刪除會話的行爲。 gc_max_lifetime只是一個傳遞給您的會話處理函數的參數。它可以被使用或忽略,只要你喜歡。你只需要使用你想要的任何邏輯。

例如,您可以簡單地向數據庫添加一個字段,以確定這是「長」會話還是「短會話」。然後相應地更改您的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值傳遞給gc()你可以使用間隔X秒爲好。

+0

我在使用會話表中的自定義列的Zend會話工具時遇到了困難。但是這個答案啓發了我在登錄時簡單地更新會話。不幸的是,我在更新會話時也遇到了麻煩,因爲它使用與登錄它們相同的邏輯來更新會話。所以,我設置了一個會話變量,並在下一頁加載時檢查它: '\t if($ aj-> lifetime =='day' ) \t { \t \t $ db = Zend_Db_Table :: getDefaultAdapter(); \t \t $ sid = Zend_Session :: getId(); \t \t $ where = $ db-> quoteInto('session_id =?',Zend_Session :: getId()); $ db-> update('session',array('lifetime'=> 2592000),$ where); \t \t $ aj-> lifetime ='month'; \t}' – user2188915