我怎么知道会话是否仍然有效?

时间:2011-07-07 09:59:25

标签: php session

我将会话ID存储在数据库表中。一世   想要运行一个从表中读取的脚本   会话ID并检查此会话是否处于活动状态。

我知道会话信息存储在一个   目录(默认为/tmp)并从那里删除   会议结束时。但如果用户关闭他的   浏览器没有断开会话   会话文件仍在/tmp目录中。

如何知道会话是否仍处于活动状态?

我搜索过会话功能但没找到   任何有用的东西。

4 个答案:

答案 0 :(得分:6)

一般来说,唯一的方法是拥有一个“上次使用”的日期时间/时间戳,每次引用会话时都会更新,并在会话未被使用一段时间后丢弃/取消激活会话。 / p>

无法判断某个会话是否会被进一步引用,因为它们不会在请求之间保持打开状态,只需在需要时引用......并且需要由不断变化的客户端决定。

如果您的会话是基于文件的,听起来如此,您可以使用各个文件的last accessed date,这可能会给您带来一些麻烦。

答案 1 :(得分:1)

如果您要在数据库中保留会话。将上次访问或修改的时间戳添加到数据库表。我已经将代码放在我的程序中,这些代码检索或存储会话信息,这些会话信息是在一个多小时前删除了修改过的会话。但是你想要你的会话多久。在每次通话时,您都可以更新该时间戳。这似乎会导致性能损失,但我已经使用了那种模式/过程。我几乎总是使用数据库来存储会话信息。你应该研究session_set_save_handler()。我可以尝试从之前的项目中收集我自己的一些代码,但是我确信阅读本手册和谷歌搜索实现会对你有所帮助。

答案 2 :(得分:0)

为什么你会关心这已经过时的会议?无论如何,它们将在一些随机时间从临时文件夹中清除。

您应该检查数据库中的最后访问时间,如果它超过了一些预定义的超时 - 将其标记为已死。

但请考虑一下你的表现。这是将会话数据存储在 memcache 或类似内容中的更好方法 - 只需将其存储在内存中,而不是存储在数据库中。在此处阅读更多相关信息:http://memcached.org/

将会话数据存储在memcached中非常简单:http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/

答案 3 :(得分:0)

没有这样的功能。 PHP本身使用有点黑客来确定会话何时到期,有几个 php.ini配置文件中的选项。

简而言之,每次会话开始时都会有一个gc_probability / gc_divisor个句子,php会启动一个 待处理数据的垃圾收集。 在gc_maxlifetime秒之前访问的会话被认为已过期,PHP将删除它们。

您可以在此行为中继调整已包含的选项或使用a模仿此行为 类似的方法。

供参考: