Вы можете добавить приведение к for Action
, хотя он получает немного LISP'y со всеми круглыми скобками:
M((Action)(() => throw new Exception()));
Не идеально, но если вы хотите максимальная ясность:
Action thrw = () => throw new Exception();
M(thrw);
Путем большинство веб-серверов работает (Apache, например) должен поддержать набор рабочих потоков. Когда Сценарий PHP выполняется, один поток выполняет Сценарий PHP.
Когда Ваш сценарий делает sleep(100)
, сценарий занимает 100 секунд для выполнения.. Это означает, что Ваш рабочий поток занят в течение 100 секунд.
Проблема, у Вас есть очень конечное число рабочих потоков - говорят, что у Вас есть 10 потоков, и 10 человек входят в систему - теперь, Ваш веб-сервер не может служить дальнейшим ответам..
Лучший способ к логинам ограничения скорости (или другие действия) состоит в том, чтобы использовать некоторую быструю вещь устройства хранения данных в оперативной памяти (memcached, идеально подходит для этого), но это требует рабочего отдельного процесса и довольно сложно (Вы могли бы сделать это при выполнении чего-то как Facebook..).
Более простой, у Вас могла быть таблица базы данных, которая хранит user_id
или ip_address
, first_failed
и failure_counter
.
Каждый раз, когда Вы получаете неудавшийся вход в систему, Вы (в псевдо коде) сделали бы:
if (first_failed in last hour) and (failure_counter > threshold):
return error_403("Too many authentication failures, please wait")
elseif first_failed in last hour:
increment failure_counter
else:
reset first_failed to current time
increment failure_counter
Возможно, не самое эффективное, и существует лучшие пути, но это должно остановить принуждение скота вполне прилично. Используя memcached в основном то же, но база данных заменяется memcached (который более быстр),
Ваш предложенный метод вынудит ВСЕХ пользователей ожидать излишне перед входом в систему.
Большинство серверов ЛАМПЫ (и большинство маршрутизаторов/переключателей, на самом деле) уже настроены для предотвращения Атак "отказ в обслуживании". Они делают это путем отклонения нескольких последовательных просьб от того же IP-адреса.
Вы не хотите помещать сон в свой php. Выполнение так значительно сократит количество параллельных запросов, которые может обработать Ваша подача, так как у Вас будут соединения сохраненными открытым ожиданием.
Большинство серверов HTTP имеет опции, которые можно активировать для предотвращения DoS-атак, но сбой, что необходимо просто отследить IP-адреса, которые Вы видели слишком много раз слишком недавно и отправляете им 403, Запрещенные с сообщением, прося, чтобы они ожидали секунда.
Если по некоторым причинам Вы не можете рассчитывать на REMOTE_ADDR, являющийся конкретным пользователем (все позади того же брандмауэра, и т.д.) Вы могли доказать, что проблема во входе в систему формирует и заставляет удаленный браузер сделать расширенное вычисление на нем (скажите, учтите число), что можно быстро проверить сторону сервера (с быстрым умножением).
остановить ботов, злонамеренных пользователей, и т.д. от выполнения сценариев PHP слишком быстро?
Я сначала спросил бы, что Вы действительно пытаетесь предотвратить? Если бы это - атаки "отказ в обслуживании", то я должен был бы сказать, что нет ничего, что можно сделать, если Вы ограничены тем, что можно добавить к Сценариям PHP. Состояние так вне того, от чего мы как программисты можем защитить. Начните смотреть на инструменты системного администратора, разработанные с этой целью.
Или Вы пытаетесь ограничить свой сервис так, чтобы настоящие люди могли получить доступ к нему, но боты не могут? Если так, я посмотрел бы на некоторые методы "капчи".
Или Вы пытаетесь препятствовать тому, чтобы пользователи опросили Ваш сайт каждый второй поиск нового содержания? Если так, я исследовал бы обеспечение канала RSS или некоторого другого способа уведомить их так, они не съедают Вашу пропускную способность.
Или это - что-то еще?
В целом я сказал бы, что никакой сон (), ни usleep () не является хорошим путем.