我有一个PHP网站,这是一个游戏,由于游戏的性质,人们垃圾点击按钮不耐烦。我认为这让我感到悲伤,从数据库中经常请求数据等,所以我想添加一个点击限制器,这样他们每秒只能点击一次,或者半秒钟。
如果没有在用户最后一次点击的数据库中存储一个注释,然后将它与那些点击太快的数据进行比较,有没有这样做呢?也许饼干? JavaScript的?会话?
正确方向的任何指针都很有用。
当我说点击时,我指的是刷新/重新加载页面等的链接/按钮 - 基本上是页面调用。
更新:每个页面都会请求大量数据,所以我想在页面顶部进行会话检查才能继续进行最简单的操作?
答案 0 :(得分:1)
我会尝试使用setTimeout
创建javascript控件,以限制何时可以点击操作按钮。
如果失败了,如果问题是真的快速刷新浏览器,请在请求到达PHP脚本之前使用可以检测+拒绝泛洪的内容
如果您可以控制您的apache / server设置,则可以使用http://code.google.com/p/autodrop/之类的内容 - 访问Apache访问日志的防洪保护脚本。通过iptables阻止某些ips超过定义的阈值。对于负载平衡API访问非常有用
答案 1 :(得分:0)
实际上限制服务器流量的唯一方法是使用Javascript阻止点击,因为这是客户端。对于大多数用户来说,这样会很好,尽管有些人可能已将其禁用或知道如何删除它。
使用会话将是更“正确”的方式,但是你的服务器仍然会受到一些压力。
答案 2 :(得分:0)
如果问题仅仅是数据库,而不是后端php服务器,请将其放在memcache中。
答案 3 :(得分:0)
我为页面上的所有可点击对象设置了onclick,以禁用页面上特定时间内的所有其他可点击对象,然后重新启用它们。如果他们没有任何可点击的内容,他们就无法点击垃圾邮件。
答案 4 :(得分:0)
最简单的方法是让所有服务器端脚本至少运行一段时间。例如如果您想在点击之间强制执行2秒的延迟,请执行
<?php
session_start();
$start = microtime(true);
.... do stuff
$end = microtime(true);
if (($end - $start) < 2) {
sleep (2 - ($end - $start));
}
让每个脚本保持会话打开(假设您使用基于标准文件的会话)处理程序将在此脚本运行时有效锁定用户,因为PHP在使用时锁定会话文件,并阻止任何在锁定时,启动并行命中。
时间计算只会强制执行时间延迟,因此即使用户从刷新按钮中弹出,他们仍然只能每2秒获得一页。
答案 5 :(得分:0)
同样的问题,不同的主题和相同的答案:
session_start();
$now = time();
if ($_SESSION['click'] > ($now-1)) {
exit("You're clicking too fast") ;
}
$_SESSION['click'] = $now;