PHP:会话死亡更改DB

时间:2010-10-14 20:33:22

标签: php session session-set-save-handler

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

会话终止时,如何调用将更改数据库中值的函数? 我已经看过覆盖session_set_save_handler()。但这要求我覆盖整个函数并定义自己的会话。是否有一个被调用的函数可用于更改我的DB变量?

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

由于

编辑:对于那些和我一样的人,我做了nikic建议的。我有一个日志,跟踪每个用户访问的每个页面。为了检查用户是否在线,我检查我的数据库以检查登录变量是否已设置,然后仔细检查最近是否有某些活动知道用户是否确实在线。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

假设您使用默认的基于文件的会话处理程序,您可以轻松地编写一个脚本,该脚本扫描会话保存目录,查找超过超时期限的会话文件,并根据该脚本更新数据库。 “如果会话文件超过30分钟,请将用户设置为'已注销'在数据库中”。为此,您可以将用户的数据库ID存储在会话文件中,然后解压缩(会话文件只是serialize()的{​​{1}}'内容),或者从文件名中提取会话ID (默认为$_SESSION[])并使用它来更新数据库。

除非你有一个庞大的数据库接口库需要处理,否则无法看到这将超过20或30行代码。使用SPL DirectoryIterator,扫描文件的'mtime'是微不足道的。

答案 2 :(得分:-1)

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

相关问题