2010-02-13 81 views
3

我正在嘗試對開源項目進行一些更改。我想跟蹤用戶登錄和註銷的時間。 現在,我在登錄或手動註銷時,將其登錄狀態更改爲分貝。現在的問題是,我無法確定用戶是否在不按下注銷按鈕的情況下關閉瀏覽器。 因爲這個原因,我需要觸發一個函數,每次用戶會話到期時都會更改數據庫。 我試過session_set_save_handler在PHP中,但它看起來像我需要重寫整個會話行爲。我正在尋找的是保持默認會話行爲,並在用戶會話過期時添加功能。有沒有辦法做到這一點?PHP會話過期事件

回答

4

我做了一件真的討厭一次。每次會話通過頁面刷新/獲取/更新等,我都更新了數據庫行的時間戳。第二個守護進程每10分鐘輪詢一次數據庫並執行「清理」操作。

您不會找到任何原生PHP設施來實現您的目標。會話超時不會在後臺運行。您甚至不知道會話是否超時,除非超時會話嘗試另一次訪問。在這一點上,幾乎不可能陷入困境,你可以做出適當的決定和處理。

我建議隊列&輪詢體系結構爲這個問題。這很容易,一定會工作。如果您擔心事務性能,請添加memcached。

+0

我做了類似的事情。我做了一個函數,它會更新用戶最近的頁面/活動,並輪詢查找大於2分鐘的非活動會話的數據庫並清除它們。我認爲我可以用一塊石頭殺死兩隻鳥。凌亂,但完成了工作,無需創建一個cron工作。 – 2012-06-11 21:16:09

0

我認爲你正在使用標準的基於PHP文件的會話。如果是這樣的話,那麼PHP將根據php.ini中的session.gc_ *配置參數自行收集過時的會話。您可以重寫這些以完全禁用垃圾回收器,然後滾動您自己的GC腳本。

您可以檢查文件上的時間戳(在stat()循環中快速簡單地執行)來查找「舊」會話,或者解析每個文件中的數據以檢查列出最後一個文件的變量 - 訪問時間。無論哪種方式,會話文件僅僅是serialize($_SESSION)的輸出,並且可以輕鬆地重新加載到另一個PHP實例中。

-1

JavaScript上的窗口關閉事件呢?所以基本上會話會在會話網站的所有窗口關閉時被銷燬。所以,最後一個窗口關閉時(通過額外的js檢查來檢查)發送ajax請求到服務器。

+0

好主意,不過就是因爲關閉窗口並不意味着會話結束,他們可以保持瀏覽器打開並重新加載網頁,他們仍然會使用他們的原始會話。不僅如此,在同一個域中留下一個網頁作爲另一個網頁會觸發ajax事件,該事件會在數據庫仍然訪問該網站時從數據庫中刪除會話信息。如果有一個JavaScript事件來檢查瀏覽器關閉,那會更好。 – 2012-06-11 21:43:50