PHP站点将点击限制为1秒


php site limit clicks to a second

我有一个php网站,这是一个游戏,由于游戏的性质,人们不耐烦地垃圾点击按钮。我认为这是导致我悲伤,请求数据过于频繁从数据库等,所以我想添加一个点击限制,使他们只能点击一次每秒,或半秒。

如果没有在数据库中存储用户最后一次点击的时间,然后将其与点击太快的时间进行比较,是否有办法做到这一点?也许饼干?javascript ?会话吗?

任何指向正确方向的指针都是有用的。

当我说点击时,我指的是刷新/重新加载页面等链接/按钮-基本上是页面调用。

UPDATE:每个页面请求大量数据,所以我认为在页面继续之前,可能在页面顶部进行会话检查是最简单的?

我会尝试使用setTimeout创建javascript控件,以限制操作按钮何时可点击。

如果失败,如果问题是刷新浏览器非常快,使用可以在请求到达PHP脚本之前检测+拒绝洪水的东西

如果你有控制你的apache/服务器设置,你可以使用类似http://code.google.com/p/autodrop/-访问洪水保护脚本apache访问日志。通过iptables阻止某些超过定义阈值的ip。用于负载均衡API访问

真正限制服务器流量的唯一方法是使用Javascript阻止点击,因为这是客户端。对于大多数用户来说,这是可以的,尽管有些用户可能已经禁用了它,或者知道如何删除它。

使用会话将是更"正确"的方式,但这样你仍然会给服务器带来一些压力。

如果关注的只是数据库,而不是后端php服务器,把它放在memcache

我设置了页面上所有可点击对象的onclick,以便在特定时间内禁用页面上所有其他可点击对象,然后重新启用它们。如果他们没有什么可点击的,他们就没有办法进行垃圾点击。

最简单的方法是让所有服务器端脚本至少在超时时间内运行。例如,如果你想在点击之间强制设置2秒的延迟,那么执行

<?php

session_start();    
$start = microtime(true);
.... do stuff
$end = microtime(true);
if (($end - $start) < 2) {
   sleep (2 - ($end - $start));
}

让每个脚本保持会话打开(假设您使用的是标准的基于文件的会话)处理程序将在脚本运行时有效地锁定用户,因为PHP在使用会话文件时锁定会话文件,并防止在锁持有期间启动任何并行命中。

时间计算只是强制时间延迟,所以即使用户浪费了刷新按钮,他们仍然只能每2秒获得一个页面。

同样的问题,不同的话题,相同的答案:

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