php сайт ограничивает количество кликов до секунды - PullRequest
1 голос
/ 01 ноября 2011

У меня есть php-сайт, который является игрой, и из-за характера игры люди спамят из-за нетерпения.Я думаю, что это вызывает у меня горе, слишком частый запрос данных из базы данных и т. Д., Поэтому я подумал о добавлении ограничителя кликов, чтобы они могли щелкать только раз в секунду или полсекунды.

сделать это без сохранения заметки в базе данных о времени последнего клика пользователей, а затем сравнить ее с тем, если они щелкают слишком быстро?Может быть, печенье?JavaScript?сессий?

Было бы полезно использовать любые указатели в правильном направлении.

Когда я говорю "щелчки", я имею в виду ссылки / кнопки, которые обновляют / перезагружают страницу и т.д.ОБНОВЛЕНИЕ: каждая страница запрашивает много данных, так что я думаю, может быть, проверка сеанса в верхней части страницы перед ее продолжением является самой простой?

Ответы [ 6 ]

1 голос
/ 01 ноября 2011

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

В противном случае, если проблема заключается в быстром обновлении браузера, используйте что-то, что может обнаружить + отклонить флуд до того, как запросы попадут в ваши PHP-скрипты

Если у вас есть контроль над настройками apache / server, вы можете использовать что-то вроде http://code.google.com/p/autodrop/ - Доступ к сценарию защиты от флуда для журнала доступа Apache. Блокирует определенные ips, превышающие определенный порог, через iptables. Полезно для доступа к API балансировки нагрузки

0 голосов
/ 03 ноября 2011

тот же вопрос, другая тема и тот же ответ:

session_start();

$now = time();

if ($_SESSION['click'] > ($now-1)) { 
    exit("You're clicking too fast") ; 
}

$_SESSION['click'] = $now;

0 голосов
/ 01 ноября 2011

Самый простой способ - запустить все сценарии на стороне сервера как минимум в течение периода ожидания.Например, если вы хотите установить 2-секундную задержку между щелчками, выполните

<?php


session_start();    

$start = microtime(true);

.... do stuff

$end = microtime(true);

if (($end - $start) < 2) {
   sleep (2 - ($end - $start));
}

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

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

0 голосов
/ 01 ноября 2011

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

0 голосов
/ 01 ноября 2011

Если проблема связана только с базой данных, а не с внутренними php-серверами, поместите ее в memcache.

0 голосов
/ 01 ноября 2011

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

Использование сеансов было бы более "правильным" способом, но тогда вы все равно испытываете нагрузку на свои серверы.

...