2013-07-22 67 views
1

我有2個方面需要會話管理,用2個不同到期日:Zend的Session和命名空間到期

  • 行政區域 - 20分鐘
  • 保留區 - 3分鐘

使用Zend_Session,我該如何管理同一用戶?

重要的是要注意,預留區域的行爲非常像Ticketmaster,其中保持精確到第二位的關鍵是至關重要的。

我目前的實施利用了Zend_Session_SaveHandler_DbTable,我想堅持下去,如果可能的話。

我在預訂表上的主要會話表中存儲Session_ID以表示預留。這很好,因爲它允許我使用垃圾回收來清理廢棄的會話(我每分鐘都會觸發一次垃圾回收)。

我的這個實現的問題是,我不知道如何管理行政區的會話,給定時間差異。

+0

你能解釋一下你對棄用會話做了些什麼嗎?您的cron工作是否對會話ID過期的預訂做了些什麼? –

+0

@TimFountain cron作業每分鐘都會簡單地調用會話垃圾回收(請參閱'Zend_Session_SaveHandler_DbTable :: gc()')。垃圾回收會刪除會話記錄,並且由於我在預留表上的Session_ID上有一個innoDB外鍵約束,因此它會將會話ID外鍵設置爲NULL,從而刪除預留。 – Travis

+0

您的用戶在進行預訂時是否登錄到網站? –

回答

1

我認爲你需要一個應用程序級別的東西來管理這些保留,而不是依靠會話本身。會話過期時很難「做事」,而我認爲會話並不是真的被設計爲依賴於這種功能。

我建議你創建一個單獨的表,其中包含預留令牌。這些將具有唯一的「令牌」散列作爲主鍵,「過期」日期以及可能的可選用戶ID。而不是將Session_ID存儲在預留表上,而是存儲該標記,並使用相同的約束(因此刪除標記可釋放保留)。您添加一個額外的cron作業,過期令牌 - 這可能與執行DELETE FROM reservation_tokens WHERE expires < NOW()查詢一樣簡單。在存儲令牌的會話中,檢查令牌的過期時間會告訴您預留是否仍然有效。

這樣您的預訂到期不再依賴於會話過期。如果他們要再次登錄(在預訂過期之前),它還將允許登錄用戶等事物仍然具有相同的預留。

至於管理登錄,我過去採取的方法是簡單地延長用戶認證時的會話終止時間。這是很容易做到的,只是後一個有效的登錄:

// assuming $result is a Zend_Auth_Result 
if ($result->isValid()) { 
    // extend the user's session 
    $lifetime = 1200; 
    ini_set('session.cookie_lifetime', $lifetime); 
    Zend_Session::rememberMe($lifetime); 
} 

,如果你已經實現了預留令牌的解決方案,具有更長的會話將不再會與您預訂的問題。

+0

我一直在傾向於此,但希望有人會對另一種選擇有所瞭解,這種選擇不需要我建立自己的預訂系統。至少我有一個工作結構來從構建它時複製。謝謝。 – Travis

0

您可以在Zend_Session_Namespace中使用setExpirationSeconds方法。

$session->setExpirationSeconds(10); 

在10秒內到期。

+0

Zend_Session_Namespace的問題是我無法使用垃圾回收管理它們的到期(請參閱'Zend_Session_SaveHandler_DbTable :: gc())')。它只關心外部會話的生命週期。 – Travis