PHP如果有';过去15分钟内有任何请求/活动


PHP How can I find if there's been any request/activity in the past 15 minutes?

当用户关闭浏览器,会话被终止时,我需要更新我的当前用户数据库。因此,我设置了一个简单的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方法更准确、更灵活。