我正在嘗試對開源項目進行一些更改。我想跟蹤用戶登錄和註銷的時間。 現在,我在登錄或手動註銷時,將其登錄狀態更改爲分貝。現在的問題是,我無法確定用戶是否在不按下注銷按鈕的情況下關閉瀏覽器。 因爲這個原因,我需要觸發一個函數,每次用戶會話到期時都會更改數據庫。 我試過session_set_save_handler
在PHP中,但它看起來像我需要重寫整個會話行爲。我正在尋找的是保持默認會話行爲,並在用戶會話過期時添加功能。有沒有辦法做到這一點?PHP會話過期事件
回答
我做了一件真的討厭一次。每次會話通過頁面刷新/獲取/更新等,我都更新了數據庫行的時間戳。第二個守護進程每10分鐘輪詢一次數據庫並執行「清理」操作。
您不會找到任何原生PHP設施來實現您的目標。會話超時不會在後臺運行。您甚至不知道會話是否超時,除非超時會話嘗試另一次訪問。在這一點上,幾乎不可能陷入困境,你可以做出適當的決定和處理。
我建議隊列&輪詢體系結構爲這個問題。這很容易,一定會工作。如果您擔心事務性能,請添加memcached。
我認爲你正在使用標準的基於PHP文件的會話。如果是這樣的話,那麼PHP將根據php.ini中的session.gc_ *配置參數自行收集過時的會話。您可以重寫這些以完全禁用垃圾回收器,然後滾動您自己的GC腳本。
您可以檢查文件上的時間戳(在stat()循環中快速簡單地執行)來查找「舊」會話,或者解析每個文件中的數據以檢查列出最後一個文件的變量 - 訪問時間。無論哪種方式,會話文件僅僅是serialize($_SESSION)
的輸出,並且可以輕鬆地重新加載到另一個PHP實例中。
JavaScript上的窗口關閉事件呢?所以基本上會話會在會話網站的所有窗口關閉時被銷燬。所以,最後一個窗口關閉時(通過額外的js檢查來檢查)發送ajax請求到服務器。
好主意,不過就是因爲關閉窗口並不意味着會話結束,他們可以保持瀏覽器打開並重新加載網頁,他們仍然會使用他們的原始會話。不僅如此,在同一個域中留下一個網頁作爲另一個網頁會觸發ajax事件,該事件會在數據庫仍然訪問該網站時從數據庫中刪除會話信息。如果有一個JavaScript事件來檢查瀏覽器關閉,那會更好。 – 2012-06-11 21:43:50
- 1. ASP.NET會話已過期 - 事件ID 1309
- 2. 節點/快速:會話過期事件?
- 3. PHP會話過期太快
- 4. PHP CURL - 會話過期
- 5. PHP會話過期問題
- 6. PHP會話過期太早
- 7. PHP會話過期早
- 8. Laravel會話到期事件
- 9. 會話到期事件?
- 10. PHP會話在使用期間過期
- 11. PHP會話到期
- 12. PHP會話到期
- 13. PHP會話到期
- 14. PHP會話快速隨機過期
- 15. PHP memcached會話將過期藍色
- 16. PHP會話過期重定向
- 17. 設置會話過期php配置?
- 18. Django會話過期
- 19. sfGuardUser - 會話過期
- 20. 會話未過期?
- 21. 使會話過期
- 22. Firebase會話過期
- 23. WKWebView會話過期
- 24. Struts2會話過期
- 25. PHP會話超時爲0,但會話仍然過期
- 26. ASP.NET會話不會過期
- 27. 凡過濾會話過期
- 28. 如何在cherrypy中監聽會話過期事件?
- 29. 會話結束時的PHP事件?
- 30. Laravel 4 - auth.basic過濾器會話不會過期|如何過期auth.basic會話
我做了類似的事情。我做了一個函數,它會更新用戶最近的頁面/活動,並輪詢查找大於2分鐘的非活動會話的數據庫並清除它們。我認爲我可以用一塊石頭殺死兩隻鳥。凌亂,但完成了工作,無需創建一個cron工作。 – 2012-06-11 21:16:09