PHP - принудительное ожидание пользователя перед использованием ресурсов сервера - PullRequest
1 голос
/ 03 апреля 2012

У меня есть функция PHP, которую я хочу сделать общедоступной в Интернете, но она использует много ресурсов сервера при каждом ее вызове.

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

Я бы предпочел, чтобы это ожидание было применено на стороне сервера, чтобы сомнительные клиенты не могли его переопределить. Я планирую настаивать на том, чтобы пользователи входили в онлайн-аккаунт.

Есть ли эффективный способ заставить пользователя ждать, не используя ресурсы сервера? Будет ли 'sleep ()' подходящим способом сделать это? Есть ли какие-либо проблемы с использованием sleep ()? Есть ли лучшее решение для этого?

Извините за мое невежество и спасибо!

Ответы [ 5 ]

1 голос
/ 03 апреля 2012

Если вы планируете принудительно ввести логин пользователя, тогда проблема стала намного проще.

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

1 голос
/ 03 апреля 2012

sleep() вам совсем не поможет. Пользователь может просто загрузить страницу дважды одновременно, и команда будет выполняться дважды сразу после друг друга.

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

1 голос
/ 03 апреля 2012

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

1 голос
/ 03 апреля 2012

sleep было бы хорошо, если бы вы использовали PHP в качестве инструмента командной строки, например.Для веб-сайта ваш sleep будет держать соединение открытым.Ваш веб-сервер будет иметь только ограниченное число одновременных подключений, поэтому его можно использовать для DOS вашего сайта.

Лучшим, но более сложным способом было бы использование очереди заданий.Добавьте задачу в очередь, которая обрабатывается запланированным сценарием, и обновите веб-страницу с помощью AJAX или мета-обновления.

0 голосов
/ 03 апреля 2012

Лучше всего это обрабатывать на уровне сервера. Нет причин даже вызывать PHP для повторных запросов.

Как и многие сайты, я использую Nginx, и вы можете использовать ограничение скорости , чтобы блокировать повторные запросы на определенное количество. Например, три запроса на IP в час.

...