1

我正在为一个项目使用 PHP。我已将会话寿命设置为 0,以便当用户关闭浏览器时,会话终止并且他/她被注销。但是,我在数据库中有一个状态变量,它存储告诉我用户是否登录的信息。我用它来通知其他用户特定用户的状态。

当会话结束时,我如何调用一个函数来改变我的数据库中的值?我看过覆盖 session_set_save_handler()。但这需要我重写整个函数并定义我自己的会话。是否有一个函数可以用来更改我的数据库变量?

有没有更好的方法来实现我想要实现的目标?

谢谢

编辑:对于那些和我一样情况的人,我按照尼克的建议做了。我有一个日志,可以跟踪每个用户访问的每个页面。为了检查用户是否在线,我检查我的数据库以检查是否设置了登录变量,然后仔细检查最近是否有一些活动以了解用户是否实际在线。

4

3 回答 3

1

没有简单的方法这样做。通常,网站会在数据库中保存用户的最后一个动作,并说他只有在最后 N 分钟内完成了一个动作。此外,如果用户手动注销,您也可以将最后操作时间设置为 0,以考虑到这一点。

于 2010-10-14T20:37:14.833 回答
0

PHP 的会话垃圾收集器不提供任何可以触发脚本更新“用户在线”变量的回调机制。这将是非常好的,但现在它不在 PHP 中。

假设您使用的是默认的基于文件的会话处理程序,您可以轻松地编写一个脚本,扫描会话保存目录中的会话文件是否早于您的超时期限,并基于此更新您的数据库。“如果会话文件超过 30 分钟,请在数据库中将用户设置为‘注销’”。为此,您可以将用户的数据库 ID 存储在会话文件中,然后提取它(会话文件只是serialize()'d 的内容$_SESSION[]),或者从文件名中提取会话 ID('sess_' . session_id()默认情况下)并使用它来更新数据库。

除非您有一个庞大的数据库接口库要处理,否则看不到这将是超过 20 或 30 行代码。使用 SPL DirectoryIterator,扫描文件的“mtime”非常简单。

于 2010-10-14T21:59:43.790 回答
-1

实际上,每次用户发出请求时,过期时间 = 0 的会话都会终止。服务器无法知道浏览器是打开还是关闭,这就是会话在 X 分钟后过期的原因(也是我们首先拥有整个会话概念的原因)。

于 2010-10-14T20:38:21.943 回答