2012-09-09 44 views
1

我存儲我的所有會話與此數據庫中的application.ini在application.ini中設置Zend Framework DB垃圾收集? (和引導?)

/* Session */ 
resources.session.use_only_cookies = on 
resources.session.gc_maxlifetime = 864000 
resources.session.remember_me_seconds = 864000 
resources.session.cookie_lifetime = 864000 
resources.session.name= "sessionName" 

resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable" 

resources.session.saveHandler.options.name = "sessions" 
resources.session.saveHandler.options.primary = "id" 
resources.session.saveHandler.options.modifiedColumn = "modified" 
resources.session.saveHandler.options.dataColumn = "data" 
resources.session.saveHandler.options.lifetimeColumn = "lifetime" 

的會話過期未在數據庫中刪除。我錯過了什麼?應該有什麼東西在引導?如果任何人都可以幫助它,將不勝感激。謝謝。

回答

0

當會話爲read或調用destroy時,它看起來像是從數據庫中刪除了過期的會話。

//from Zend_Session_SaveHandler_DbTable 
public function read($id) 
    { 
     $return = ''; 

     $rows = call_user_func_array(array(&$this, 'find'), $this->_getPrimary($id)); 

     if (count($rows)) { 
      if ($this->_getExpirationTime($row = $rows->current()) > time()) { 
       $return = $row->{$this->_dataColumn}; 
      } else { 
       $this->destroy($id); 
      } 
     } 

     return $return; 
    } 


public function destroy($id) 
    { 
     $return = false; 

     if ($this->delete($this->_getPrimary($id, self::PRIMARY_TYPE_WHERECLAUSE))) { 
      $return = true; 
     } 

     return $return; 
    } 

可能還有其他數據庫記錄被刪除但我沒有找到它們的情況。

+0

謝謝您的回覆。看着這個,如果我提供sessionid,它似乎只會銷燬或重新啓動會話。如果兩個星期過去了,這個人再也不會回來了?我沒有sessionid來提供它。我環顧四周,有一個gc_maxlifetime和gc_dividor等,它使用垃圾收集器來擺脫過時的會話。我是否誤解了數據庫表中自動過期的概念,並且必須調用函數以明確過期?也許用cronjob? – Darius

+0

如果您仔細考慮過,保存處理程序無法知道會話是否已過期,直到它嘗試以某種方式訪問​​該會話。所有到期數據保存在數據庫或cookie中後。因此,像cron作業這樣的維護操作將是處理數據庫清理的最實用方法。 – RockyFord