2012-06-30 87 views
10

如何將會話存儲在數據庫中? 我做到了使用此代碼:數據庫中的PHP會話

function write ($session_id, $session_data) 
// write session data to the database. 
{ 
    if (!empty($this->fieldarray)) { 
     if ($this->fieldarray['session_id'] != $session_id) { 
      // user is starting a new session with previous data 
      $this->fieldarray = array(); 
     } // if 
    } // if 

    if (empty($this->fieldarray)) { 
     // create new record 
     $array['session_id'] = $session_id; 
     $array['date_created'] = getTimeStamp(); 
     $array['last_updated'] = getTimeStamp(); 
     $array['session_data'] = addslashes($session_data); 
     $this->_dml_insertRecord($array); 
    } else { 
     // update existing record 
     if (isset($_SESSION['logon_user_id'])) { 
      $array['user_id'] = $_SESSION['logon_user_id']; 
     } // if 
     $array['last_updated'] = getTimeStamp(); 
     $array['session_data'] = addslashes($session_data); 
     $this->_dml_updateRecord($array, $this->fieldarray); 
    } // if 

    return TRUE; 

} // write 

但是我應該如何automaticaly刪除它像以前一樣。我的意思是如何在超時後自動刪除會話?

+0

爲什麼不簡單地序列化$ _SESSION對象? –

回答

-1

在你的代碼session_destroy();年底關閉會話:

<?php 
    session_destroy(); 
?> 
1

我不得不在前一段時間處理這個問題,並且有兩種解決方案,這兩種解決方案都不是很漂亮,但是在這裏。

  1. 在事件(鬆散的),你的腳本會檢查是否有發送到服務器的會話ID,那麼它會看看是否會在你的數據庫,順序,如果會話已過期。一旦建立了與會話數據庫的連接,就可以考慮對所有具有超過當前時間戳的到期日期的記錄運行DELETE查詢。然後搜索用戶剛剛發送的ID。這種方式每次人們使用您的網站時都會進行清理

  2. 您可能會考慮另外做的另一種方法是使用CHRON作業或其他自動化腳本,每隔一段時間運行一次以清理過期條目你的會話表。如果您的網站收到較少的流量,這是一個很好的方法。

方法的組合是這樣的。在您的腳本中,當您驗證會話時,請檢查發現會話數據的過期日期。如果找到該ID,但會話已過期,請刪除該會話並開始一個新的會話。如果你這樣做,你不會遇到太多的ID衝突問題或許多查詢減慢你的服務器。您仍然可以在每天結束時運行您的時鐘作業以運行完整的清理。

確保您的系統是否有某種類型的註銷按鈕,以便手動註銷將觸發刪除用戶會話。

0

看看HTTP_Session2。梨文檔:

HTTP_Session2提供額外的功能,使用DB和MDB2包會話數據如數據庫存儲。它還引入了新的方法,如isNew(),useCookies(),setExpire(),setIdle(),isExpired(),isIdled()等。

如果你想實現你的,請查看該包內的MDB2.php中的代碼。它包含一個垃圾回收方法(gc),它與session_set_save_handler結合起來應該可以做到。