smf 2.0.19 насколько много ресурсов нужно потратить, чтобы определить, что обращение идёт от анонимного пользователя
Для SMF 2.0.19 проверка того, является ли пользователь анонимным, — это одна из самых «дешевых» и быстрых операций. Ресурсов на это тратится ничтожно мало.Вот как это работает технически:Глобальная переменная: SMF при загрузке страницы всегда инициализирует массив $user_info.Проверка ID: Статус гостя определяется по значению $user_info['is_guest']. Если ID пользователя равен 0, движок считает его анонимным.Затраты: Это обычная проверка булевого значения или сравнение чисел в оперативной памяти. Процессор тратит на это доли микросекунды, так как данные уже подгружены из сессии или куки в начале выполнения скрипта.В коде это выглядит так:phpif ($user_info['is_guest']) {
// Это аноним (гость)
}
... и добавил:Итог: С точки зрения нагрузки на сервер, эта операция практически бесплатна. Вам не нужно делать дополнительные запросы к базе данных каждый раз, когда вы хотите это проверить, так как статус гостя кэшируется в памяти на время выполнения скрипта.Хотите узнать, как лучше всего ограничить функционал для таких пользователей без вреда для производительности?
... и добавил:| а можно ли сделать уже на уровне веб сервера, чтобы даже до движка не доходило |
Да, это можно сделать на уровне веб-сервера (Nginx или Apache). Это позволит отсекать запросы от анонимов еще до того, как запустится PHP-интерпретатор и база данных, что значительно сэкономит ресурсы при бот-атаках.
... и добавил:можно ограничить анонимов только при превышении нагрузки более 60%
Да, это технически возможно, но такая логика не является стандартной для веб-серверов «из коробки», так как Nginx или Apache обычно не следят за нагрузкой CPU в реальном времени для принятия решений по каждому запросу.Для реализации такой «умной» блокировки есть три основных пути:
1. Использование Nginx + Lua (OpenResty) — Самый эффективныйЭто профессиональный способ. Модуль lua-nginx-module позволяет выполнить небольшой скрипт прямо в процессе обработки запроса.Логика: Скрипт раз в несколько секунд читает /proc/loadavg, и если значение выше порога, ставит флаг. Если флаг стоит и у пользователя нет куки SMF — сервер отдает 503 или 403.Плюс: Практически нулевая нагрузка на систем
.2. Использование внешнего «предохранителя» (Bash-скрипт)Если вы не хотите ставить Lua, можно использовать обычный Bash-скрипт, который будет работать по крону (раз в минуту) или в цикле.Логика: Скрипт проверяет нагрузку. Если она > 60%, он подменяет один конфигурационный файл Nginx на другой (где включена блокировка анонимов) и делает nginx -s reload.Минус: Задержка в реакции (до 1 минуты) и лишние перезагрузки конфига.
3. На уровне PHP (SMF) — Самый простой в реализацииХотя вы хотели «до движка», иногда проще и безопаснее сделать это в самом начале index.php форума. Это все равно сэкономит ресурсы БД, так как проверка будет идти до тяжелых запросов.Пример кода для вставки в начало index.php:php$load = sys_getloadavg();
// Если средняя нагрузка за последнюю минуту > 2.0 (для 4-ядерного это ~50%)
// И пользователь — гость (куки нет)
if ($load[0] > 2.0 && empty($_COOKIE['SMFCookie11'])) {
header('HTTP/1.1 503 Service Unavailable');
die('Сервер перегружен. Пожалуйста, войдите в аккаунт или зайдите позже.');
}