mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-28 06:08:52 +00:00
[ticket/15294] Fix session_gc() selecting expired sessions for unique users
Also remove limit of 10 as it does not allow to collect all the garbage. PHPBB3-15294
This commit is contained in:
parent
78ce646c69
commit
e9fc3ed22e
1 changed files with 28 additions and 28 deletions
|
@ -954,8 +954,6 @@ class session
|
||||||
{
|
{
|
||||||
global $db, $config, $phpbb_container, $phpbb_dispatcher;
|
global $db, $config, $phpbb_container, $phpbb_dispatcher;
|
||||||
|
|
||||||
$batch_size = 10;
|
|
||||||
|
|
||||||
if (!$this->time_now)
|
if (!$this->time_now)
|
||||||
{
|
{
|
||||||
$this->time_now = time();
|
$this->time_now = time();
|
||||||
|
@ -968,14 +966,21 @@ class session
|
||||||
$db->sql_query($sql);
|
$db->sql_query($sql);
|
||||||
|
|
||||||
// Get expired sessions, only most recent for each user
|
// Get expired sessions, only most recent for each user
|
||||||
$sql = 'SELECT session_user_id, session_page, MAX(session_time) AS recent_time
|
// Inner SELECT gets most recent expired sessions for unique session_user_id
|
||||||
|
// Outer SELECT gets session_page for them
|
||||||
|
$sql = 'SELECT s1.session_page, s1.session_user_id, s1.session_time AS recent_time
|
||||||
|
FROM ' . SESSIONS_TABLE . ' AS s1
|
||||||
|
INNER JOIN (
|
||||||
|
SELECT session_user_id, MAX(session_time) AS recent_time
|
||||||
FROM ' . SESSIONS_TABLE . '
|
FROM ' . SESSIONS_TABLE . '
|
||||||
WHERE session_time < ' . ($this->time_now - $config['session_length']) . '
|
WHERE session_time < ' . ($this->time_now - (int) $config['session_length']) . '
|
||||||
GROUP BY session_user_id, session_page';
|
GROUP BY session_user_id
|
||||||
$result = $db->sql_query_limit($sql, $batch_size);
|
) AS s2
|
||||||
|
ON s1.session_user_id = s2.session_user_id
|
||||||
|
AND s1.session_time = s2.recent_time';
|
||||||
|
$result = $db->sql_query($sql);
|
||||||
|
|
||||||
$del_user_id = array();
|
$del_user_id = array();
|
||||||
$del_sessions = 0;
|
|
||||||
|
|
||||||
while ($row = $db->sql_fetchrow($result))
|
while ($row = $db->sql_fetchrow($result))
|
||||||
{
|
{
|
||||||
|
@ -985,7 +990,6 @@ class session
|
||||||
$db->sql_query($sql);
|
$db->sql_query($sql);
|
||||||
|
|
||||||
$del_user_id[] = (int) $row['session_user_id'];
|
$del_user_id[] = (int) $row['session_user_id'];
|
||||||
$del_sessions++;
|
|
||||||
}
|
}
|
||||||
$db->sql_freeresult($result);
|
$db->sql_freeresult($result);
|
||||||
|
|
||||||
|
@ -998,10 +1002,7 @@ class session
|
||||||
$db->sql_query($sql);
|
$db->sql_query($sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($del_sessions < $batch_size)
|
// Update gc timer
|
||||||
{
|
|
||||||
// Less than 10 users, update gc timer ... else we want gc
|
|
||||||
// called again to delete other sessions
|
|
||||||
$config->set('session_last_gc', $this->time_now, false);
|
$config->set('session_last_gc', $this->time_now, false);
|
||||||
|
|
||||||
if ($config['max_autologin_time'])
|
if ($config['max_autologin_time'])
|
||||||
|
@ -1019,7 +1020,6 @@ class session
|
||||||
$sql = 'DELETE FROM ' . LOGIN_ATTEMPT_TABLE . '
|
$sql = 'DELETE FROM ' . LOGIN_ATTEMPT_TABLE . '
|
||||||
WHERE attempt_time < ' . (time() - (int) $config['ip_login_limit_time']);
|
WHERE attempt_time < ' . (time() - (int) $config['ip_login_limit_time']);
|
||||||
$db->sql_query($sql);
|
$db->sql_query($sql);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Event to trigger extension on session_gc
|
* Event to trigger extension on session_gc
|
||||||
|
|
Loading…
Add table
Reference in a new issue