我正在尝试对开源项目进行一些更改。我想跟踪用户登录和注销的时间。 现在,我在登录或手动注销时,将其登录状态更改为分贝。现在的问题是,我无法确定用户是否在不按下注销按钮的情况下关闭浏览器。 因为这个原因,我需要触发一个函数,每次用户会话到期时都会更改数据库。 我试过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. 节点/快速:会话过期事件?
- 2. ASP.NET会话已过期 - 事件ID 1309
- 3. PHP会话过期太早
- 4. PHP CURL - 会话过期
- 5. PHP会话过期早
- 6. 会话到期事件?
- 7. Laravel会话到期事件
- 8. PHP会话到期
- 9. PHP会话到期
- 10. PHP会话到期
- 11. PHP memcached会话将过期蓝色
- 12. PHP会话过期重定向
- 13. Django会话过期
- 14. 会话未过期?
- 15. sfGuardUser - 会话过期
- 16. 使会话过期
- 17. WKWebView会话过期
- 18. Firebase会话过期
- 19. Struts2会话过期
- 20. PHP会话超时为0,但会话仍然过期
- 21. ASP.NET会话不会过期
- 22. 如何在cherrypy中监听会话过期事件?
- 23. 会话结束时的PHP事件?
- 24. PHP会话变量到期
- 25. PHP会话意外到期
- 26. Symfony 2 AJAX会话过期
- 27. CodeIgniter中的会话过期
- 28. IIS 7.0会话过期ASP.net
- 29. 防止会话过期?
- 30. 滑动过期.net会话
我做了类似的事情。我做了一个函数,它会更新用户最近的页面/活动,并轮询查找大于2分钟的非活动会话的数据库并清除它们。我认为我可以用一块石头杀死两只鸟。凌乱,但完成了工作,无需创建一个cron工作。 – 2012-06-11 21:16:09