Задержка выполнения Сценария PHP

Вы можете добавить приведение к for Action, хотя он получает немного LISP'y со всеми круглыми скобками:

M((Action)(() => throw new Exception()));

Не идеально, но если вы хотите максимальная ясность:

Action thrw = () => throw new Exception();
M(thrw);
7
задан Mussnoon 1 February 2009 в 06:08
поделиться

4 ответа

Путем большинство веб-серверов работает (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 (который более быстр),

8
ответ дан 6 December 2019 в 19:43
поделиться

Ваш предложенный метод вынудит ВСЕХ пользователей ожидать излишне перед входом в систему.

Большинство серверов ЛАМПЫ (и большинство маршрутизаторов/переключателей, на самом деле) уже настроены для предотвращения Атак "отказ в обслуживании". Они делают это путем отклонения нескольких последовательных просьб от того же IP-адреса.

1
ответ дан 6 December 2019 в 19:43
поделиться

Вы не хотите помещать сон в свой php. Выполнение так значительно сократит количество параллельных запросов, которые может обработать Ваша подача, так как у Вас будут соединения сохраненными открытым ожиданием.

Большинство серверов HTTP имеет опции, которые можно активировать для предотвращения DoS-атак, но сбой, что необходимо просто отследить IP-адреса, которые Вы видели слишком много раз слишком недавно и отправляете им 403, Запрещенные с сообщением, прося, чтобы они ожидали секунда.

Если по некоторым причинам Вы не можете рассчитывать на REMOTE_ADDR, являющийся конкретным пользователем (все позади того же брандмауэра, и т.д.) Вы могли доказать, что проблема во входе в систему формирует и заставляет удаленный браузер сделать расширенное вычисление на нем (скажите, учтите число), что можно быстро проверить сторону сервера (с быстрым умножением).

1
ответ дан 6 December 2019 в 19:43
поделиться

остановить ботов, злонамеренных пользователей, и т.д. от выполнения сценариев PHP слишком быстро?

Я сначала спросил бы, что Вы действительно пытаетесь предотвратить? Если бы это - атаки "отказ в обслуживании", то я должен был бы сказать, что нет ничего, что можно сделать, если Вы ограничены тем, что можно добавить к Сценариям PHP. Состояние так вне того, от чего мы как программисты можем защитить. Начните смотреть на инструменты системного администратора, разработанные с этой целью.

Или Вы пытаетесь ограничить свой сервис так, чтобы настоящие люди могли получить доступ к нему, но боты не могут? Если так, я посмотрел бы на некоторые методы "капчи".

Или Вы пытаетесь препятствовать тому, чтобы пользователи опросили Ваш сайт каждый второй поиск нового содержания? Если так, я исследовал бы обеспечение канала RSS или некоторого другого способа уведомить их так, они не съедают Вашу пропускную способность.

Или это - что-то еще?

В целом я сказал бы, что никакой сон (), ни usleep () не является хорошим путем.

3
ответ дан 6 December 2019 в 19:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: