Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用数据库会话集保存处理程序处理会话不活动是否有一个好的解决方案?_Php_Mysql - Fatal编程技术网

Php 使用数据库会话集保存处理程序处理会话不活动是否有一个好的解决方案?

Php 使用数据库会话集保存处理程序处理会话不活动是否有一个好的解决方案?,php,mysql,Php,Mysql,我正在使用session\u set\u save\u handler将会话数据保存到数据库中。我的代码运行良好。我希望在我的自定义处理程序中处理会话不活动。我想在X分钟后注销用户。在我的Read方法中,我的select查询返回会话id和会话数据的时间戳(lastchanged列)。如果时间戳和当前时间之间的差异大于X分钟,我尝试调用会话\u destroy,但是在destroy方法之后,处理程序再次调用Write方法 session_set_save_handler(

我正在使用
session\u set\u save\u handler
将会话数据保存到数据库中。我的代码运行良好。我希望在我的自定义处理程序中处理会话不活动。我想在X分钟后注销用户。在我的
Read
方法中,我的select查询返回会话id和会话数据的时间戳(lastchanged列)。如果时间戳和当前时间之间的差异大于X分钟,我尝试调用
会话\u 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(),但无法正常注销。有没有更干净的方法来处理会话不活动

还有几个问题:

1) 我应该在php.ini中将save_处理程序的设置更改为“User”吗? 2) 我应该使用时间戳显式终止会话吗


谢谢

我认为完成您正在尝试的任务的最简单方法是让
读取
知道在会话过期时返回一些空值,然后使用
setcookie
手动销毁会话ID(通常cookie名称为
phpsesid
)。

如果会话过期(在数据库中创建一个会话表以确保会话结束日期时间)您应该启动一个新的会话表,并将旧的会话表保留在rest中(cookie仍将过期)。通过gc方法,您可以设置清理机制,从旧会话数据中清除数据库。

我会在数据库中放置会话过期时间索引,并使用cron作业定期清理数据库(即删除过期的会话)。然后,您可以将此任务卸载到一天中流量较小时,或将此任务作为低优先级

毕竟,只要数据库不占用太多空间,数据库包含过期会话真的重要吗


顺便说一句-这可以通过几行SQL来实现

在我知道会话已过期后,我尝试在读取方法中使用setcookie销毁会话ID,但每次调用我的自定义处理程序时似乎都会注销。此外,如果我返回空字符串,如“DEACTIVATE”从我的会话数据读取方法中,写入方法无法识别它。会话表已经存在。如果会话已过期,并且我在读取方法中检测到,我如何阻止它执行写入方法。我已将保存处理程序更改为“用户”在php.ini中,因为我正在转移到数据库支持的会话。我应该恢复吗?您不必担心执行的方法。唯一重要的是,当会话过期时,启动另一个会话。我更喜欢从代码而不是从php.ini注册处理程序的方法,因为我可以轻松地将会话数据保存到database.如果你不想停止读写任何过期的会话数据,你应该检查读写方法:If(SessionManager::Instance()->expired()){return}或类似的东西。我不太担心需要cron作业。我的“Gc”方法应该能够根据session.gc\u maxlifetime设置处理此问题。我正在使用它运行“删除”sql与当前时间结合使用。我关心的是,如果用户在一段时间内处于非活动状态,则会删除该用户会话。当另一个用户登录时,GC会启动,并根据时间差将第一个用户呈现为非活动状态。