2010-10-14 69 views
1

我正在使用PHP进行项目。我已将会话寿命设置为0,以便当用户关闭浏览器时,会话消失并且他/她已注销。但是,我在DB中有一个状态变量,它存储了告诉我用户是否登录的信息。我用这个来通知其他用户一个特定用户的状态。PHP:关于会话死亡更改DB

当会话死了,我怎么能叫,这将改变我的数据库中值的函数? 我看了覆盖session_set_save_handler()。但是这需要我重写整个函数并定义我自己的会话。有没有一个函数可以用来更改我的数据库变量?

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

感谢

编辑:对于那些在同样的情况,因为我,我没有什么建议nikic。我有一个记录每个用户访问的每个页面的日志。为了检查用户是否在线,我检查我的数据库以检查是否设置了登录变量,然后仔细检查最近是否有一些活动知道用户是否实际在线。

+0

会话超时不能用于判断用户是否在线。只需使用你自己的。跟踪用户活动并在最近3-5分钟内对活动用户进行计数。 – 2010-10-14 20:39:23

回答

1

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

+0

我想到了这个想法,但这意味着我必须设置一个cron作业来查找用户的最后一个动作时间。如果可能,我试图找到更好的解决方案。看来我最终会覆盖session_set_save_handler() – 2010-10-14 21:02:14

+0

@Nandit:我真的不明白为什么你需要为此做一个cron工作。您只需将时间戳保存在数据库中,并且只想列出所有用户时,您只需执行“SELECT WHERE lastAction> DATE_SUB(NOW(),INTERVAL 5 MINUTES)'或类似的操作。 – NikiC 2010-10-14 21:20:36

+0

当然。我不知道我在想什么。 谢谢。这为我节省了很多麻烦。 编辑:但这意味着我必须每次用户请求一个页面时更新数据库。我想尽可能避免那些额外的DB呼叫 – 2010-10-14 21:28:02

-1

实际上,expire time = 0的会话每当用户发出请求时都会死亡。服务器无法知道浏览器是打开还是关闭,这就是为什么会话在X分钟后过期(以及为什么我们将整个会话概念放在首位)。

+0

我使用session_set_cookie_params()将会话的生存期设置为0。 值0表示“在浏览器关闭之前”。 来源:http://www.php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime – 2010-10-14 20:47:36

+0

well session_set_cookie_params是关于cookie(客户端),而不是会话(服务器端) – cambraca 2010-10-15 14:43:09

0

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

假设您使用的是默认的基于文件的会话处理程序,那么您可以简单地启动一个脚本来扫描会话保存目录中的会话文件,该会话文件比您的超时期限早,并基于此更新数据库。 “如果会话文件大于30分钟,则将用户设置为”登出“数据库”。要做到这一点,你既可以在用户的​​数据库ID存储在会话文件,并提取(会话文件都只是serialize()倒是的$_SESSION[]内容),或从文件名('sess_' . session_id()默认情况下),并使用提取会话ID是更新数据库。

看不出这将是代码的任何超过20个或30行,除非你有一个庞大的数据库接口库来处理。使用SPL DirectoryIterator,为他们的'mtime'扫描文件是微不足道的。