• Блог
  • Отключаем сессии для ботов

На днях в сообществе появилась интересная статья про сессии в MODX. Тема очень актуальная. Особенно интересен тот факт, что при небольшой посещаемости таблица сессий содержит огромное количество записей (сотни тысяч строк). И оказывается, основную часть этого списка (более 95% со слов автора) занимают боты. Автор решил задачу уменьшения объёма таблицы через сокращение времени хранения сессий ботов. Плюс добавил гибкости в управление сессиями для остальных категорий клиентов.

Информация!

Сессии решают задачу передачи данных пользователя между запросами. Для этого каждый запрос пользователя помечается специальным идентификатором, который называется куки. По этому идентификатору PHP подгружает данные из специального хранилища, сохранённые в предыдущем сеансе пользователя. Этот идентификатор посылает браузер. А вот боты и мобильные приложения куки не посылают, а значит для сервера каждый такой запрос как новый, и для каждого создаётся строка в таблице. Соответственно, сколько запросов, столько и строк в таблице.

В MODX можно отключить сессии для гостей, т.е. незалогиненных пользователей, с помощью системной настройки anonymous_sessions. Но есть дополнения, которые используют сессии для гостей — miniShop2, AjaxForm, HybridAuth, SiteStatistics и ряд других. Поэтому данное решение не подойдёт.

Внимание!

В MODX можно отключить сессии для гостей, т.е. незалогиненных пользователей, с помощью системной настройки anonymous_sessions. Но есть дополнения, которые используют сессии для гостей — miniShop2, AjaxForm, HybridAuth, SiteStatistics и ряд других. Поэтому данное решение не подойдёт.

Для себя я решил, что хотя у меня таблица сессий содержит всего несколько десятков тысяч строк и весит не больше 50 Мб, мне всё-таки не хочется хранить сессии ботов. У меня нет задачи учёта статистики. Поэтому я создал свой класс управления сессиями, который просто не стартует сессии для ботов.

Итак, создадим класс mySessionHandler в отдельном файле core/model/modx/mysessionhandler.class.php.

<?php
require_once  __DIR__ . '/modsessionhandler.class.php';

class mySessionHandler extends modSessionHandler
{
    public function __construct(modX $modx)
    {
        parent::__construct($modx);

        // Если бот или юзер-агент пустой, выключаем сессию.
        if ($this->isBot() || empty($_SERVER['HTTP_USER_AGENT'])) {
            $modx->setOption('anonymous_sessions', false);
        }
    }

    private function isBot()
    {
        return preg_match('~(bot|index)~i', $_SERVER['HTTP_USER_AGENT']);
    }
}

Как видите, идёт поиск по юзер-агенту на слова «bot» и «index» независимо от регистра. Если эти слова найдены, то настройка, управляющая включением сессии для неавторизованных пользователей, выключается и соответственно сессия не стартует.

Вы можете указать свои ключи для определения ботов. Например, на modhost.pro каждые 10 минут стучится бот «Wget/1.19.4 (linux-gnu)», который проверяет доступность сайта. Для него хранить сессии также не нужно, поэтому добавляем его в список (bot|index|wget/1.19). Для гибкости их можно вынести в системную настройку. Для пакета так и нужно было бы сделать. Но для себя в этом смысла немного.

Теперь остается только подключить созданный класс. Для этого в системной настройке session_handler_class нужно указать имя нашего класса — «mySessionHandler». Ну и через какое-то время проверяем. Количество записей в таблице сессий должно значительно сократиться.

П.С. Только имейте ввиду, что для ботов в этом случае будет недоступен функционал, использующий сессии. Это очевидно, но озвучу на всякий случай.

1   2670

Комментарии ()

  1. mngatoff 04 декабря 2021 # 0
    отлично, но после этой процедуры перестает работать кнопка «завершить все сеансы» в админке. выбрасывает flush_sessions_not_supported
    1. Сергей Шлоков 04 декабря 2021 # 0
      Отличный улов!:v Сразу 2 бага.
      1. Не подгружается лексикон.
      2. Стоит ненужная проверка на название класса хандлера, не позволяющая его расширять.
      if ($this->modx->getOption('session_handler_class',null,'modSessionHandler') == 'modSessionHandler')
      Тогда не понятно, зачем вообще нужна эта системная настройка?

      Не знаю, исправят ли в двойке, но в MODX3 точно уберём.

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.