当用户关闭浏览器,会话被终止时,我需要更新我的当前用户数据库。因此,我设置了一个简单的cron作业来删除该行。
DELETE FROM visit WHERE unix_timestamp(time)<unix_timestamp(now()-600) and sessionid <>(LIST OF SESSIONS ..need help)
由于StackOverflow上提供了此代码,我可以获得会话文件(谢谢)
$sessions = array();
$path = realpath(session_save_path());
$files = array_diff(scandir($path), array('.', '..'));
foreach ($files as $file)
{
$sessions[$file] = unserialize(file_get_contents($path . '/' . $file));
}
echo '<pre>';
print_r($sessions);
echo '</pre>';
我的问题是,代码后半部分返回的那些文件是活动会话的列表吗?基本上,我试图验证所有将被删除的行都将包含不属于"ACTIVE"列表的会话,这些会话应该由unserialize(file_get_contents($path.'/'.$file));返回
我读到另一种方法是检查最后一次活动的时间戳(如果它大于10分钟)。但我不知道如何将"最后的活动"记录到数据库中
感谢
哇!
引用计数不是跟踪会话的好方法,尤其是当会话存储在完全独立的基底中时。试图将活动会话列表从活动会话列表中分离出来是一种冗余。
我会重新开始。使用绑定数据库的会话处理程序。是否允许重新加载早于gc_maxlifetime的会话取决于您(默认处理程序允许这样做)。
然后(例如,将过期会话视为不再活动):
SELECT COUNT(*)
FROM sessions
WHERE last_updated>(UNIX_TIMESTAMP() + ' . ini_get('gc_maxlifetime') . ')
我的问题是,代码后半部分返回的那些文件是活动会话的列表吗?
如上所述,这取决于您对活动的定义。其中一些将比gc_maxlifetime更早,但(使用默认处理程序)仍然可用。
如果您不担心重复使用过时的会话/重复使用相同的登录详细信息,那么计算session_save_path()中的文件可能会更快,但DB方法更准确、更灵活。