【问题标题】:cakephp update field on session timeout会话超时的cakephp更新字段
【发布时间】:2012-03-12 23:58:03
【问题描述】:

我在 CakePHP 中使用数据库会话,同时将用户 ID 保存在与会话相同的表中。是否有可能以某种方式检测用户会话何时过期,以便我可以更新数据库中的一个字段?

我需要这样,以防用户没有从网站手动注销(只是关闭浏览器或什至不关闭),我可以从表中删除该会话。

【问题讨论】:

  • 数据库会话会在一段时间后自动清理,就像常规会话一样。这就是他们超时的意义所在。你到底想在这里手动做什么?
  • 嗯,我就是这么想的。我有“1”的超时(在中等安全级别,所以我相信 100 秒超时)。我已经完成了登录,我可以在会话数据库中看到记录。我已经从 MySQL 管理员检查了一段时间(超过 30 分钟),刷新页面并尝试从不同位置使用相同的用户名登录,但该记录尚未删除。在我完成数据库表的刷新后,它终于被删除了。
  • 所以我的问题是,会话超时实际上是如何对数据库会话起作用的?究竟是什么触发了从该表中删除记录的事件?它需要访问网站吗?或者它只是在会话到期时发生?

标签: session cakephp session-timeout


【解决方案1】:

会话数据清理依赖于垃圾回收 (gc)。此垃圾收集过程仅在 PHP 脚本运行时调用,即它没有在可以清理的时候清理数据,而是在稍后运行另一个 PHP 脚本时。由于垃圾回收也会占用一些资源,所以它不会每次都运行,但有一定的概率会在每次脚本调用时运行。 The default is that gc runs about once every 100 script invocations.

因此您不会看到陈旧的数据立即消失。相反,它最终会被清除掉。

【讨论】:

  • 好的,这意味着一旦会话过期,会话表中的那些记录最终将被删除,而无需我创建一些代码来执行此操作对吗?
  • 我做了另一个测试,会话超时设置为 14(总共 1400 秒)。我已经登录,检查了会话表,我的会话就在那里。我已经离开计算机超过一个小时,并检查了会话表,并且相同的会话仍然存在。会话已过期,因为当我尝试转到另一个页面时,系统提示我登录(应该如此)。此时,我检查了表格,然后旧会话的记录已经消失了。以前不应该已经过去了吗?
  • 再一次,垃圾收集只是偶尔运行一次,而且只有当你的一个 PHP 脚本运行时。如果没有任何使用会话的 PHP 脚本运行,垃圾收集将不会运行。即便如此,每 100 个脚本运行中只有大约 1 个调用垃圾回收。它只是最终被清除,无法保证它何时准​​确发生或它会在接近实时的任何地方发生。垃圾回收是一个在计算中被大量使用的概念,它始终是一个低优先级、无特定时间保证的过程。
  • 好的,我明白了,我问是因为我遇到了一些奇怪的行为。当用户登录时,我将他的 ID 与会话 ID 和数据一起保存在同一个会话表中。但在此之前,我检查他的用户名当前是否未登录(查看该表)。如果他的用户名在该表中,我拒绝登录以避免多个用户同时使用一个帐户。为了让用户以公平的方式工作,重要的是从该表中删除过期的会话,这并没有发生,因为我认为它会发生......
  • 你为什么拒绝多次登录?这在网站上通常没有用。为什么我不能打开另一个浏览器并从两个浏览器同时登录?如果我关闭浏览器,会话 cookie 被删除,然后立即重新打开浏览器并尝试再次登录怎么办?会话在服务器上仍然有效,但我无法再访问它,必须等待它超时才能再次登录。你想用这个解决什么问题?
猜你喜欢
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
相关资源
最近更新 更多