Разберемся с настройками сессий
Заходим в админку modx, нажимаем Управление - Отчёты - Информация о системе
Напротив пункта phpinfo(): жмем кнопку Просмотреть
Сверяем следующие пункты:
session.gc_probability - должно быть 1
session.gc_divisor - стандартное значение 100
Для того чтобы изменить эти значения, в большинстве своём, достаточно, добавить следующие записи в .htaccess
php_value session.gc_probability 100
php_value session.gc_divisor 1
Теперь сессии должны очищаться при каждом 100 обращении к сайту.
Теперь разберемся, а какие вообще сессии должны удаляться.
Смотрим на настройку:
session.gc_maxlifetime - стандартное значение 3600
session.cookie_lifetime - стандартное значение 3600
Суть простая, если сессия создалась раньше чем текущее время минус значение в настройках, то её нужно удалить.
php_value session.gc_maxlifetime 3600
php_value session.cookie_lifetime 3600
Эта настройка означает, что время хранения куки и сессии равно 1 часу
В modx за настройки времени хранения сессий отвечают следующие ключи:
Если вы используете пакет smartSessions, то у вас могут неверно писаться юзер агент в таблицу modx_smart_sessions, из-за чего не будут удаляться сессии ботов.
Вы можете заметить что не все HTTP_USER_AGENT записываются в таблицу modx_smart_sessions, в столбце user_agent.
Один из экстремальных вариантов:
$user_agent = filter_input(INPUT_SERVER, 'HTTP_USER_AGENT', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);
Заменить на:
$user_agent = $_SERVER['HTTP_USER_AGENT'];
Обратите внимание что таким образом вы подвергаете свой сайт sql иньекции, так как храните приходящий HTTP_USER_AGENT в чистом виде.