我使用session_set_save_handler
将会话数据保存到数据库。我的代码运行正常。我想在我的自定义处理程序本身处理会话不活动。我想在X分钟后注销用户。在我的Read
方法中,我的select查询返回会话ID与会话数据的时间戳(lastchanged列)。如果时间戳和当前时间之间的差异大于X分钟,我尝试调用session_destroy
但是在Destroy方法之后处理程序再次调用Write方法。
session_set_save_handler(
array($this, 'Open'),
array($this, 'Close'),
array($this, 'Read'),
array($this, 'Write'),
array($this, 'Destroy'),
array($this, 'Gc'));
我尝试使用exit()但它没有正常注销。是否有更简洁的方法来处理会话inactivty?
其他几个问题:
1)我应该在php.ini中将save_handler的设置更改为“User”吗? 2)我应该使用时间戳明确地使会话到期吗?
由于
答案 0 :(得分:1)
如果某个会话已过期(在数据库中创建一个会话表以确保会话结束日期时间),您应该开始一个新会话并保留旧会话表(无论如何,cookie都将过期)。通过gc方法,您可以设置清理机制以从旧会话数据中清除数据库。
答案 1 :(得分:0)
我认为完成您尝试的最简单方法是让Read
知道如果会话已过期则返回一些空值,然后使用setcookie
手动销毁会话ID (通常cookie名称为PHPSESSID
)。
答案 2 :(得分:0)
我会在数据库中的会话过期时间上放一个索引,并有一个cron作业来定期整理数据库(即删除过期的数据库)。然后,您可以将此任务卸载到流量较轻的一天中的某一部分,或将任务作为低优先级。
毕竟,只要数据库不占用太多空间,数据库是否包含过期会话真的很重要吗?
BTW - 这可以通过几行SQL
来实现